Java定時任務
在日常工作中,定時進行任務調度的業務隨處可見,比如:定時清理係統的臨時文件、有新的活動定時向用戶發送電子郵件、定時檢查係統是否需要更新、定時發送短信等業務。在Java中由兩個類完成定時任務的調度,分別為:java.util.Timer和java.util.TimerTask
創建一個定時任務的步聚:
1、創建一個定時器(Timer)對象
2、調用該對象的或schedule(TimerTask task, long delay, long period)scheduleAtFixedRate(TimerTask task,
long delay, long period)方法
任務調度方法參數說明:
task:表示要執行的具體任務
:表示任務創建完成後,第一次什麼時候開始執行該任務,以毫秒為單位delay
period:表示第一次執行完任務後,後續重複執行該任務的時間間隔是多長,以毫秒為單位
schedule方法與scheduleAtFixedRate方法的區別:
| 方法 | 任務執行時間 | 當任務執行時間大於間隔時間時 |
| schedule | 上次任務的結束時間+時間間隔 | 阻塞式,任務會延後,等待前麵的任務執行完,再執行延務後的任務 |
| scheduleAtFixedRate | 上次任務的執行時間+時間間隔 | 任務不會延後,但要考慮多線程並發的問題。因為當一個任務還沒執行完時,下一個時間間隔任務又會啟動,執行相同的任務 |
注意:每啟動一個新任務,就會啟動一個新的線程!
package taskschedule;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
/*
* 定時器
*
* schedule():下一次任務的執行時間,等於上一次任務的結束時間+時間間隔
*
* scheduleAtFixedRate():下一次任務的執行時間,等於上一次任務的開始時間+時間間隔
*
* 當執行任務的時間大於時間間隔時:
* schedule任務會延後。
* scheduleAtFixedRate任務不會延後,仍然在時間間隔內執行,存在並發性,要考慮線程同步的問題
*/
public class TimerTest {
private static int count = 0;
public static void main(String[] args) {
task_1();
//task_2();
//task_3();
//task_4();
//主線程
while(true) {
System.out.println(Calendar.getInstance().get(Calendar.SECOND));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//任務1:第一次延遲3秒後啟動任務,後續每隔2秒啟動一次任務
private static void task_1() {
new Timer().schedule(new TimerTask(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "定時任務已啟動!");
}}, 3000,2000);
}
//任務2:交互執行,方式1:第一次延遲2秒後啟動任務,後續每隔在3秒和6秒之間切換啟動任務
private static void task_2() {
class MyTimerTask extends TimerTask {
@Override
public void run() {
count = (count+1)%2;
System.out.println(Thread.currentThread().getName() + "定時任務已啟動!");
new Timer().schedule(new MyTimerTask(), 3000 + 3000 * count); //循環調用
}
}
new Timer().schedule(new MyTimerTask(), 2000); //2秒後啟動定時器
}
//任務3:交互執行,方式2:第一次延遲2秒後啟動任務,後續每隔在3秒和6秒之間切換啟動任務
public static void task_3() {
new Timer().schedule(new MyTimerTaskA(), 300);
}
//任務4:演示scheduleAtFixedRate方法,第一次延遲2秒後啟動任務,後續每隔3秒後啟動任務,但任務執行時間大於等於6秒
public static void task_4() {
TimerTask task = new TimerTask(){
@Override
public void run() {
System.out.println("execute task:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime()));
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "定時任務已啟動!");
}
};
new Timer().scheduleAtFixedRate(task, 2000, 3000);
}
}
//描述2個任務切換啟動
class MyTimerTaskA extends TimerTask {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "任務已啟動!");
new Timer().schedule(new MyTimerTaskB(),2000);
}
}
class MyTimerTaskB extends TimerTask {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "任務已啟動!");
new Timer().schedule(new MyTimerTaskA(), 4000);
}
}
任務執行結果:
任務1:

任務2:

任務3:

任務4:

但JDK提供的定時器任務功能有限,不能完成一些複雜的業務,比如:要每年單月的每周星期三的下午5點10分要執行一個任務,JDK則處理不了。不過不要擔心,市麵上已經有開源的任務調度框架:Quartz,官網:https://www.quartz-scheduler.org/
最後更新:2017-04-02 18:44:44
上一篇:
典型的 C++ 程序員成長經曆
下一篇:
關於安裝蛋疼的ruby gem : tk-win
Adopt Open JDK官方文檔(十)
政府安全資訊精選 2017年第十二期 中國網絡安全漏洞披露平均效率遠超美國; 美國美國國土安全部發布指令,要求聯邦機構強化Web和電子郵件安全
2017年最新免費分享阿裏雲推薦碼、邀請碼;使用阿裏雲幸運券更加優惠哦!
PHP 5大運行模式
躲過了加密勒索,企業可能還有4大潛在安全風險
【12.2新特性】在Oracle Active Data Guard上部署列式存儲
自考——The First Step
Struts中JSP到Action過程中數組的投射
【雲棲大會】讓人敬佩的白發程序員 MySQL之父Monty 的雲棲之旅
ARM相關知識