開頭簡單介紹Timer類:java.util.Timer類提供了工具,線程調度任務在后台線程中將來執行
- 這個類是線程安全的,即多個線程可以無需進行外部同步共享單個Timer對象
- 此類安排任務執行一次,或者定期重復執行
- 所有構造函數啟動一個計時器線程
定時器Java代碼:

1 package com.yzj; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 import java.util.Timer; 6 7 import javax.servlet.ServletContextEvent; 8 import javax.servlet.ServletContextListener; 9 10 public class Test implements ServletContextListener 11 { 12 13 private Timer timer = null; 14 15 /** 16 * 容器初始化servlet時調用 17 */ 18 public void contextInitialized(ServletContextEvent arg0) 19 { 20 timer = new Timer(true); 21 /* 22 * scheduleAtFixedRate()方法說明: 23 * 參數1.要執行的任務 24 * 參數2.調用scheduleAtFixedRate方法后,要等待多長時間去第一次執行run() 25 * 參數3.第一次調用后,從第二次開始每隔多長時間再去調用run() 26 */ 27 timer.scheduleAtFixedRate(new TestTask(), 10 * 1000, 30 * 1000); 28 System.out.println("開始執行contextInitialized()的時間:" + Test.getNow()); 29 } 30 31 /** 32 * servlet銷毀時調用 33 */ 34 public void contextDestroyed(ServletContextEvent arg0) 35 { 36 if (timer != null) 37 { 38 timer.cancel(); 39 } 40 } 41 42 public static String getNow() 43 { 44 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 45 return sdf.format(new Date()); 46 } 47 }

1 package com.yzj; 2 3 import java.util.TimerTask; 4 5 public class TestTask extends TimerTask 6 { 7 private static boolean isRunning = false; 8 9 int x = 0; 10 11 @Override 12 public void run() 13 { 14 x += 1; 15 System.out.println("第" + x + "次執行run()的時間:" + Test.getNow()); 16 if (!isRunning) 17 { 18 isRunning = true; 19 System.out.println("開始執行任務。"); 20 int i = 0; 21 while (i++ < 10) 22 { 23 System.out.println("已完成任務的" + i + "/" + 10); 24 } 25 isRunning = false; 26 System.out.println("任務執行結束。"); 27 } 28 else 29 { 30 System.out.println("上一次任務執行還未結束,本次任務不能執行。"); 31 } 32 } 33 }
web.xml配置
<listener> <listener-class>com.yzj.Test</listener-class> </listener>
上圖可以看出,scheduleAtFixedRate的第二個參數和第三個參數的區別
-------------------------------------------------------------------------------------------------
最后簡單說明schedule和scheduleAtFixedRate的區別:
schedule() 方法用於安排指定的任務進行重復的固定延遲執行,在指定的延遲后開始。
scheduleAtFixedRate() 方法用於安排指定的任務進行重復的固定速率執行,在指定的延遲后開始。
通俗講就是:
schedule() 如果第一次執行時間被delay了,隨后的執行時間按照上一次實際執行完成的時間點計算
scheduleAtFixedRate() 如果第一次執行時間被delay了,隨后的執行時間按照上一次開始的時間點進行計算,它會為了catch up,會多次執行任務,TimerTask中的執行體需要考慮同步
當執行任務的時間大於周期間隔時,
schedule() 下一次執行的時間相對於上一次實際執行完成的時間點,因此執行時間會不斷延后
scheduleAtFixedRate() 下一次執行的時間相對於上一次開始的時間點,因此執行時間不會延后,存在並發性