Java定時任務

http://blog.csdn.net/xyang81/article/details/7425943

在日常工作中,定時進行任務調度的業務隨處可見,比如:定時清理系統的臨時文件、有新的活動定時向用戶發送電子郵件、定時檢查系統是否需要更新、定時發送短信等業務。在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 上次任務的執行時間+時間間隔 任務不會延後,但要考慮多線程併發的問題。因爲當一個任務還沒執行完時,下一個時間間隔任務又會啓動,執行相同的任務

注意:每啓動一個新任務,就會啓動一個新的線程!


實例:

[java] view plaincopy
  1. package taskschedule;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Calendar;  
  5. import java.util.Timer;  
  6. import java.util.TimerTask;  
  7.   
  8. /* 
  9.  * 定時器 
  10.  *  
  11.  * schedule():下一次任務的執行時間,等於上一次任務的結束時間+時間間隔 
  12.  *  
  13.  * scheduleAtFixedRate():下一次任務的執行時間,等於上一次任務的開始時間+時間間隔 
  14.  *  
  15.  * 當執行任務的時間大於時間間隔時: 
  16.  * schedule任務會延後。 
  17.  * scheduleAtFixedRate任務不會延後,仍然在時間間隔內執行,存在併發性,要考慮線程同步的問題 
  18.  */  
  19. public class TimerTest {  
  20.       
  21.     private static int count = 0;  
  22.       
  23.     public static void main(String[] args) {  
  24.         task_1();  
  25.           
  26.         //task_2();  
  27.           
  28.         //task_3();  
  29.           
  30.         //task_4();  
  31.           
  32.         //主線程  
  33.         while(true) {  
  34.             System.out.println(Calendar.getInstance().get(Calendar.SECOND));  
  35.             try {  
  36.                 Thread.sleep(1000);  
  37.             } catch (InterruptedException e) {  
  38.                 e.printStackTrace();  
  39.             }  
  40.         }  
  41.     }  
  42.       
  43.     //任務1:第一次延遲3秒後啓動任務,後續每隔2秒啓動一次任務  
  44.     private static void task_1() {  
  45.         new Timer().schedule(new TimerTask(){  
  46.   
  47.             @Override  
  48.             public void run() {  
  49.                 System.out.println(Thread.currentThread().getName() + "定時任務已啓動!");  
  50.                   
  51.             }}, 3000,2000);   
  52.     }  
  53.       
  54.     //任務2:交互執行,方式1:第一次延遲2秒後啓動任務,後續每隔在3秒和6秒之間切換啓動任務  
  55.     private static void task_2() {  
  56.         class MyTimerTask extends TimerTask {  
  57.               
  58.             @Override  
  59.             public void run() {  
  60.                 count = (count+1)%2;  
  61.                 System.out.println(Thread.currentThread().getName() + "定時任務已啓動!");  
  62.                   
  63.                 new Timer().schedule(new MyTimerTask(), 3000 + 3000 * count);   //循環調用  
  64.             }  
  65.         }  
  66.           
  67.         new Timer().schedule(new MyTimerTask(), 2000);  //2秒後啓動定時器  
  68.     }  
  69.       
  70.     //任務3:交互執行,方式2:第一次延遲2秒後啓動任務,後續每隔在3秒和6秒之間切換啓動任務  
  71.     public static void task_3() {  
  72.         new Timer().schedule(new MyTimerTaskA(), 300);  
  73.     }  
  74.       
  75.     //任務4:演示scheduleAtFixedRate方法,第一次延遲2秒後啓動任務,後續每隔3秒後啓動任務,但任務執行時間大於等於6秒  
  76.     public static void task_4() {  
  77.         TimerTask task = new TimerTask(){  
  78.   
  79.             @Override  
  80.             public void run() {  
  81.                 System.out.println("execute task:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime()));  
  82.                 try {  
  83.                     Thread.sleep(6000);  
  84.                 } catch (InterruptedException e) {  
  85.                     e.printStackTrace();  
  86.                 }  
  87.                 System.out.println(Thread.currentThread().getName() + "定時任務已啓動!");  
  88.             }  
  89.         };  
  90.           
  91.         new Timer().scheduleAtFixedRate(task, 20003000);  
  92.     }  
  93. }  
  94.   
  95. //描述2個任務切換啓動  
  96. class MyTimerTaskA extends TimerTask {  
  97.   
  98.     @Override  
  99.     public void run() {  
  100.         System.out.println(Thread.currentThread().getName() + "任務已啓動!");  
  101.         new Timer().schedule(new MyTimerTaskB(),2000);  
  102.     }  
  103.       
  104. }  
  105.   
  106. class MyTimerTaskB extends TimerTask {  
  107.       
  108.     @Override  
  109.     public void run() {  
  110.         System.out.println(Thread.currentThread().getName() + "任務已啓動!");  
  111.         new Timer().schedule(new MyTimerTaskA(), 4000);  
  112.     }  
  113.       
  114. }  

任務執行結果:

任務1:


任務2:


任務3:


任務4:


但JDK提供的定時器任務功能有限,不能完成一些複雜的業務,比如:要每年單月的每週星期三的下午5點10分要執行一個任務,JDK則處理不了。不過不要擔心,市面上已經有開源的任務調度框架:Quartz,官網:http://www.quartz-scheduler.org/

發佈了26 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章