91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot中配置定時任務及線程池和多線程池執行的方法是怎樣的

發布時間:2021-10-13 10:07:41 來源:億速云 閱讀:118 作者:柒染 欄目:編程語言

SpringBoot中配置定時任務及線程池和多線程池執行的方法是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

配置基礎的定時任務

最基本的配置方法,而且這樣配置定時任務是單線程串行執行的,也就是說每次只能有一個定時任務可以執行,可以試著聲明兩個方法,在方法內寫一個死循環,會發現一直卡在一個任務上不動,另一個也沒有執行。

1、啟動類

添加@EnableScheduling開啟對定時任務的支持

@EnableScheduling@SpringBootApplicationpublic class TestScheduledApplication extends SpringBootServletInitializer { @Override  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {  return builder.sources(this.getClass()); } public static void main(String[] args) {  new SpringApplicationBuilder(TestScheduledApplication.class).web(true).run(args); }}

2、配置執行定時任務的類

添加@Component掃描本類,在方法上添加@Scheduled注解聲明定時任務,配置時間周期

@Componentpublic class TestTask1 { private static final Logger logger = LogManager.getLogger(); // 間隔1秒執行一次 @Scheduled(cron = "0/1 * * * * ?") public void method1() {  logger.info("——————————method1 start——————————");  logger.info("——————————method1 end——————————"); }}

配置線程池執行定時任務

因為有時候需要執行的定時任務會很多,如果是串行執行會帶來一些問題,比如一個很耗時的任務阻塞住了,一些需要短周期循環執行的任務也會卡住,所以可以配置一個線程池來并行執行定時任務

1、配置線程池

添加@EnableAsync開啟對異步的支持

@Configuration@EnableAsyncpublic class ExecutorConfig {  @Bean public Executor executor1() {  ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  executor.setThreadNamePrefix("test-schedule2-");  executor.setMaxPoolSize(20);  executor.setCorePoolSize(15);  executor.setQueueCapacity(0);  executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());  return executor; }}

2、配置定時任務異步執行

添加@Async注解,表示該定時任務是異步執行的,因為上面線程池配置了名字,所以可以看到打印的日志是該線程池中的線程在執行任務,如果沒有配置線程池的話會默認使用SimpleAsyncTaskExecutor,這個異步執行器每次都會開啟一個子線程執行,性能消耗比較大,所以最好是自己配置線程池

@Async@Scheduled(cron = "0/1 * * * * ?")public void method1() { logger.info("——————————method1 start——————————"); logger.info("——————————method1 end——————————");}

配置多個線程池分別執行不同的定時任務

因為有些定時任務是比較重要的,有些則是不太重要的,想把定時任務分別放到不同的線程池中,也是可以實現的。

1、配置多個線程池

分別配置兩個線程池

@Configuration@EnableAsyncpublic class ExecutorConfig1 { @Bean public Executor executor1() {  ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  executor.setThreadNamePrefix("test-schedule1-");  executor.setMaxPoolSize(20);  executor.setCorePoolSize(15);  executor.setQueueCapacity(0);  executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());  return executor; }  @Bean public Executor executor2() {  ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  executor.setThreadNamePrefix("test-schedule2-");  executor.setMaxPoolSize(20);  executor.setCorePoolSize(15);  executor.setQueueCapacity(0);  executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());  return executor;  }}

2、定時任務顯示指定調用線程池

因為上面在配置類里面初始化了兩個線程池,所以會有兩個線程池分別叫executor1和executor1被生成放到容器中,因為@Bean注解生成的對象默認就是和方法名相同的名字,而@Async注解是可以指定使用哪個線程池的。這樣就可以在不同的線程池中執行不同的定時任務了

// 間隔1秒執行一次@Async("executor1")@Scheduled(cron = "0/1 * * * * ?")public void method1() { logger.info("——————————method1 start——————————"); logger.info("——————————method1 end——————————");}// 間隔1秒執行一次@Scheduled(cron = "0/1 * * * * ?")@Async("executor2")public void method2() { logger.info("——————————method2 start——————————"); logger.info("——————————method2 end——————————");}

注意:

  1. 沒有配置自己的線程池時,會默認使用SimpleAsyncTaskExecutor。  如果項目中只配置了一個線程池,那么不需要顯示指定使用這個線程池,spring也會自動使用用戶配置的線程池,但是如果配置了多個就必須要顯示指定,否則還是會使用默認的。  如果想要指定使用哪個線程池,可以使用@Async("executor2")顯示指定。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

恩平市| 伊金霍洛旗| 瓦房店市| 新津县| 驻马店市| 旬邑县| 资源县| 若尔盖县| 南汇区| 绥中县| 商河县| 朝阳市| 丽江市| 昔阳县| 荆门市| 潼关县| 金昌市| 青岛市| 六枝特区| 平谷区| 桃源县| 乌什县| 景谷| 湾仔区| 漳浦县| 平和县| 汪清县| 南昌县| 辽源市| 沙雅县| 三台县| 石城县| 青阳县| 长子县| 武山县| 宁陵县| 牙克石市| 平昌县| 清徐县| 鲁甸县| 长治县|