今天看到定時任務, 自己也試了試手 挺好用 談談自己的見解, 順便記錄一下, 筆記
一.Spring Task簡介
1.定時任務
3.三種完成方法
1.java自帶的API java.util.Timer類 java.util.TimerTask類
2.Quartz框架 開源 功能強大 使用起來稍顯複雜
3.Spring 3.0以後自帶了task 調度工具,比Quartz更加的簡單方便(本文章介紹)
二.簡單使用
啓動類配置 @EnableScheduling //開啓任務調度
@Component
public class SpringTaskTest {
int a = 0;
@Scheduled(cron = "0/3 * * * * *")//每隔三秒去執行
public void teak() throws InterruptedException {
long startTime = System.currentTimeMillis();//記錄開始運行時間
System.out.println("程序運行開始");
a += 1;
System.out.println("執行第 :" +a +"幾次==========================");
Thread.sleep(5000);
long endTime = System.currentTimeMillis();//記錄結束運行時間
System.out.println("程序運行結束時間:" + (endTime - startTime) + "ms");
}
}
運行結果
程序運行開始
執行第 :1幾次==========================
程序運行結束時間:2000ms
程序運行開始
執行第 :2幾次==========================
程序運行結束時間:2000ms
程序運行開始
執行第 :3幾次==========================
程序運行結束時間:2001ms
每次執行完就會跟進新任務, 如果試着 Thread.sleep(5000); 大於要等待的三秒執行會怎樣?
結果是任務開始後要等待三秒纔會執行下次任務, 但是因爲上次任務還沒執行完所以會等待任務執行完後纔回去執行下次任務.
三.註解部分參數:
@Scheduled(fixedRate = 3000)//任務開始後3秒執行下次任務
@Scheduled(fixedDelay = 3000)//任務結束3秒後執行下次任務
cron表達式:
cron表達式包括6部分:
秒(0~59)
分鐘(0~59)
小時(0~23)
月中的天(1~31)
月(1~12)
週中的天 (填寫MON,TUE,WED,THU,FRI,SAT,SUN,或數字1~7 1表示MON,依次類推)
特殊字符介紹:
“/”字符表示指定數值的增量
“*”字符表示所有可能的值 “-”字符表示區間範圍 “,” 字符表示列舉
“?”字符僅被用於月中的天和週中的天兩個子表達式,表示不指定值
舉幾個例子:
每天的十點執行一個任務怎麼寫
(cron = “0 0 10 * * *”)
每週一到週三的十點五十二分三十六執行一個任務怎麼寫
(cron = "36 52 10 ? * 1-3 ")
因爲不知道每個星期的週一到週三是每個月份的幾號所以要在月中的天的位置加上?只能保留一種
串行任務:
默認就是串行
執行代碼:
@Component
public class SpringTaskTest {
int a = 0;
@Scheduled(cron = "0/3 * * * * *")//每隔三秒去執行
// @Scheduled(fixedRate = 3000)//任務開始後3秒執行下次任務
// @Scheduled(fixedDelay = 3000)//任務結束3秒後執行下次任務
public void teak() throws InterruptedException {
long startTime = System.currentTimeMillis();//記錄開始運行時間
System.out.println("teak\t程序運行開始");
a += 1;
System.out.println("執行第 :" +a +"幾次==========================");
Thread.sleep(2000);
long endTime = System.currentTimeMillis();//記錄結束運行時間
System.out.println("程序運行結束時間:" + (endTime - startTime) + "ms");
}
@Scheduled(cron = "0/3 * * * * *")//每隔三秒去執行
// @Scheduled(fixedRate = 3000)//任務開始後3秒執行下次任務
// @Scheduled(fixedDelay = 3000)//任務結束3秒後執行下次任務
public void teak2() throws InterruptedException {
long startTime = System.currentTimeMillis();//記錄開始運行時間
System.out.println("teak2\t程序運行開始");
a += 1;
System.out.println("執行第 :" +a +"幾次==========================");
Thread.sleep(2000);
long endTime = System.currentTimeMillis();//記錄結束運行時間
System.out.println("程序運行結束時間:" + (endTime - startTime) + "ms");
}
}
運行結果
teak 程序運行開始
執行第 :1幾次==========================
程序運行結束時間:2000ms
teak2 程序運行開始
執行第 :2幾次==========================
程序運行結束時間:2000ms
teak 程序運行開始
執行第 :3幾次==========================
程序運行結束時間:2001ms
teak2 程序運行開始
執行第 :4幾次==========================
程序運行結束時間:2001ms
並行任務
配置任務的線程池
@Configuration
public class AsyTaskConfig implements SchedulingConfigurer, AsyncConfigurer {
private int corePoolSize = 5;//線程池數量
@Bean
public ThreadPoolTaskScheduler taskScheduler()
{
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();//初始化線程池
scheduler.setPoolSize(corePoolSize);//線程池容量
return scheduler;
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setTaskScheduler(taskScheduler());
}
}
任務代碼
@Component
public class SpringTaskTest {
int a = 0;
@Scheduled(cron = "0/3 * * * * *")//每隔三秒去執行
// @Scheduled(fixedRate = 3000)//任務開始後3秒執行下次任務
// @Scheduled(fixedDelay = 3000)//任務結束3秒後執行下次任務
public void teak() throws InterruptedException {
long startTime = System.currentTimeMillis();//記錄開始運行時間
System.out.println("teak\t程序運行開始");
a += 1;
System.out.println("執行第 :" +a +"幾次==========================");
Thread.sleep(2000);
long endTime = System.currentTimeMillis();//記錄結束運行時間
System.out.println("程序運行結束時間:" + (endTime - startTime) + "ms");
}
@Scheduled(cron = "0/3 * * * * *")//每隔三秒去執行
// @Scheduled(fixedRate = 3000)//任務開始後3秒執行下次任務
// @Scheduled(fixedDelay = 3000)//任務結束3秒後執行下次任務
public void teak2() throws InterruptedException {
long startTime = System.currentTimeMillis();//記錄開始運行時間
System.out.println("teak2\t程序運行開始");
a += 1;
System.out.println("執行第 :" +a +"幾次==========================");
Thread.sleep(2000);
long endTime = System.currentTimeMillis();//記錄結束運行時間
System.out.println("程序運行結束時間:" + (endTime - startTime) + "ms");
}
}
執行結果
teak 程序運行開始
執行第 :1幾次==========================
teak2 程序運行開始
執行第 :2幾次==========================
程序運行結束時間:2001ms
程序運行結束時間:2001ms
teak2 程序運行開始
執行第 :3幾次==========================
teak 程序運行開始
執行第 :4幾次==========================
程序運行結束時間:2000ms
程序運行結束時間:2000ms
teak2 程序運行開始
執行第 :5幾次==========================
teak 程序運行開始
執行第 :6幾次==========================
程序運行結束時間:2000ms
程序運行結束時間:2000ms