SpringBoot併發執行定時任務

2021-10-11 08:54:33 字數 3163 閱讀 6223

剛剛看了下spring boot實現定時任務的文章,感覺還不錯。spring boot 使用spring自帶的schedule來實現定時任務變得非常簡單和方便。在這裡個大家分享下。

@enablescheduling //開啟定時任務

public static void main(string args) {

@component

public class scheduledtasks {

private logger logger = logge***ctory.getlogger(scheduledtasks.class);

// cron接受cron表示式,根據cron表示式確定定時規則

@scheduled(cron= "0/5 * * * * ? ") //每5秒執行一次

public void testcron() {

dateformat sdf = new ******dateformat( "yyyy-mm-dd hh:mm:ss");

logger.info(sdf.format( new date())+ "*********每5秒執行一次");

啟動專案,檢視控制台列印資訊,發現定時任務已經生效。spring boot 和scheduled整合完畢。

但是後來發現個問題,通過同時測試幾個任務發現,所有的任務都是在同乙個執行緒池中的同乙個執行緒來完成的。在實際開發過程中,我們當然不希望所有的任務都執行在乙個執行緒中。

@scheduled(cron= "0/1 * * * * ? ") //每1秒執行一次

public void testcron1() {

dateformat sdf = new ******dateformat( "yyyy-mm-dd hh:mm:ss");

logger.info(sdf.format( new date())+ "*********每1秒執行一次");

@scheduled(cron= "0/2 * * * * ? ") //每2秒執行一次

public void testcron2() {

dateformat sdf = new ******dateformat( "yyyy-mm-dd hh:mm:ss");

logger.info(sdf.format( new date())+ "*********每2秒執行一次");

@scheduled(cron= "0/3 * * * * ? ") //每3秒執行一次

public void testcron3() {

dateformat sdf = new ******dateformat( "yyyy-mm-dd hh:mm:ss");

logger.info(sdf.format( new date())+ "*********每3秒執行一次");

@scheduled(cron= "0/4 * * * * ? ") //每4秒執行一次

public void testcron4() {

dateformat sdf = new ******dateformat( "yyyy-mm-dd hh:mm:ss");

logger.info(sdf.format( new date())+ "*********每4秒執行一次");

那麼,怎麼設計成多執行緒實現併發呢?在網上看到過這樣的解決方案。通過scheduleconfig配置檔案實現schedulingconfigurer介面,並重寫setschedule***ng方法,我們嘗試著配置了一下。

@configuration

public class scheduleconfig implements schedulingconfigurer {

@override

public void configuretasks(scheduledtaskregistrar taskregistrar) {

taskregistrar.setscheduler(executors.newscheduledthreadpool( 5));

這樣就完成了多執行緒併發的配置?我們啟動專案通過控制台輸出資訊驗證一下結果,最後發現所有的任務都在同乙個執行緒池但不同執行緒中完成,說明這個方案完全可行,這樣,我們就完成了spring boot 多執行緒併發定時任務。

@scheduled所支援的引數:

1.cron:cron表示式,指定任務在特定時間執行;

2.fixeddelay:表示上一次任務執行完成後多久再次執行,引數型別為long,單位ms;

3.fixeddelaystring:與fixeddelay含義一樣,只是引數型別變為string;

4.fixedrate:表示按一定的頻率執行任務,引數型別為long,單位ms;

5.fixedratestring: 與fixedrate的含義一樣,只是將引數型別變為string;

6.initialdelay:表示延遲多久再第一次執行任務,引數型別為long,單位ms;

7.initialdelaystring:與initialdelay的含義一樣,只是將引數型別變為string;

8.zone:時區,預設為當前時區,一般沒有用到。

cron表示式範例:

每隔5秒執行一次:*/5 * * * * ?

每隔1分鐘執行一次:0 */1 * * * ?

每天23點執行一次:0 0 23 * * ?

每天凌晨1點執行一次:0 0 1 * * ?

每月1號凌晨1點執行一次:0 0 1 1 * ?

每月最後一天23點執行一次:0 0 23 l * ?

每週星期天凌晨1點實行一次:0 0 1 ? * l

在26分、29分、33分執行一次:0 26,29,33 * * * ?

每天的0點、13點、18點、21點都執行一次:0 0 0,13,18,21 * * ?

Python併發執行

使用map簡化併發的複雜度,生產者消費者模型實在看的頭疼 參考這篇帖子說明的很清楚 from multiprocessing.dummy import pool as threadpool import requests import time urls 定義網頁資源集合 for i in rang...

Go 併發執行

需要併發執行的場景有很多 爬蟲 拉取資料 更新資料 go作為天生高併發的語言,在使用併發時是比較方便的。package main import fmt func main description 開啟多執行緒執行 param total 啟動執行緒數 param work 需要執行的方法 func ...

什麼是併發執行?

1 併發執行就是讓計算機同時執行幾個程式或同時執行同一程式多個程序或執行緒。2 早期的計算機只具有乙個 處理器 cpu 並且是單核 只有乙個運算器 的,這種情況下計算機作業系統採用併發技術實現併發執行,具體做法是採用 時間片輪詢程序排程演算法 它的思想簡單介紹如下 在作業系統的管理下,所有正在執行的...