SpringBoot項目如何使用多線程執(zhí)行定時任務
SpringBoot使用多線程執(zhí)行定時任務
我在一個Spring Boot項目中,采用定時器執(zhí)行一些操作,比如10秒就發(fā)送一次數(shù)據(jù)。
這些操作有2個,如下所示。
我就想,雖然這兩個操作各自指定了時間頻率,但如果其中一個操作非常耗時,會不會影響其他操作呢?
答案是會。
@Service
public class ShareDataBySend {
@Autowired
SendDataService sendDataService;
//操作1
@Scheduled(fixedRateString = "${sff.interval}") // 每 * 秒執(zhí)行一次
private void send() {
sendDataService.sendThem();
}
//操作2
@Scheduled(fixedRateString = "${sff.interval}") // 每 * 秒執(zhí)行一次
private void send2() {
sendDataService.sendNce();
}
}怎么辦呢?AI告訴我,引入多線程。
引入多線程
上面代碼中,使用了注解@Scheduled。這個注解告訴 Spring ,它需要定期執(zhí)行標注的方法。@Scheduled依賴于 Spring 的任務調度機制,默認使用一個單線程的任務調度器執(zhí)行任務。如果沒有顯式地配置線程池,所有的定時任務都會在同一個線程中按順序執(zhí)行。然而,當我們配置一個線程池任務調度器時,Spring 會自動使用這個調度器,這樣每個定時任務(如 send() 和 send2())就會在不同的線程中并發(fā)執(zhí)行。
也就是說,我們不需要修改上面這個ShareDataBySend類,而是新注冊一個線程池任務調度器,系統(tǒng)就會自動改用多線程。這一切,都源自于Spring Boot框架的本身機制。
代碼示例
1、新增線程池任務調度器配置類
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
/**
* 我們將默認的單線程調度器替換成了 ThreadPoolTaskScheduler,并設置了線程池大?。ɡ?10)。
* 這意味著多達 10 個任務可以并發(fā)執(zhí)行。
*/
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10); // 設置線程池大小,可根據(jù)需要調整
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);
}
}在系統(tǒng)啟動的時候,Spring Boot會將帶有@Config注解的類型實例化到容器中,因此SchedulerConfig 配置的 ThreadPoolTaskScheduler 被初始化。
當定時任務觸發(fā)時(根據(jù) @Scheduled 的定義),任務被提交給 ThreadPoolTaskScheduler 處理。
如果有多個任務,它們會被分配到線程池中的不同線程上執(zhí)行,從而實現(xiàn)并發(fā)。
2、原ShareDataBySend類
不需要作任何修改
總結
我用java也有好幾年了。其實一直都是在用Spring Boot。Spring Boot是一個java開發(fā)框架,但我感覺Spring Boot已經足夠優(yōu)秀和方便,對于我來說,Spring Boot == Java。當然了,本質上,Spring Boot可以算是J2EE的一個流派,但青出于藍。
另外,我就相同的問題,分別問通義千問和chatGPT,前者給出的方案不僅繁瑣,而且有錯誤。這或許不是模型的問題,而是模型訓練的材料有問題。也就是說,也許中文世界中,編程問題的答案質量,與老外相比,不在一個檔次內。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
關于解決iReport4.1.1無法正常啟動或者閃退或者JDK8不兼容的問題
在安裝使用iReport的過程中遇到一個問題,我的iReport始終不能打開,困擾了我好久。接下來通過本文給大家介紹iReport4.1.1無法正常啟動或者閃退或者JDK8不兼容的問題,需要的朋友可以參考下2018-09-09
Mybatis攔截器實現(xiàn)數(shù)據(jù)分表
當數(shù)據(jù)量比較多時,放在一個表中的時候會影響查詢效率,本文主要介紹了Mybatis攔截器實現(xiàn)數(shù)據(jù)分表,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2024-01-01
MyBatis-Plus多表聯(lián)查(動態(tài)查詢)的項目實踐
本文主要介紹了MyBatis-Plus多表聯(lián)查(動態(tài)查詢)的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08

