在開發中,我們經常需要一些週期性的操作,例如每隔幾分鐘就進行某一項操作。這時候我們就要去設置個定時器,Java中最方便、最高效的實現方式是用java.util.Timer工具類,再通過調度java.util.TimerTask任務。
1、簡介
Timer是一種工具,線程用其安排以後在後臺線程中執行的任務。可安排任務執行一次,或者定期重複執行。實際上是個線程,定時調度所擁有的TimerTasks。
TimerTask是一個抽象類,它的子類由 Timer 安排爲一次執行或重複執行的任務。實際上就是一個擁有run方法的類,需要定時執行的代碼放到run方法體內。
2、調用方法
Timer timer = Timer(true); // 注意,javax.swing包中也有一個Timer類,如果import中用到swing包,要注意名字的衝突。 TimerTask task = new TimerTask() { public void run() { ... //每次需要執行的代碼放到這裏面。 } }; //以下是幾種常用調度task的方法: timer.schedule(task, time); // time爲Date類型:在指定時間執行一次。 timer.schedule(task, firstTime, period); // firstTime爲Date類型,period爲long // 從firstTime時刻開始,每隔period毫秒執行一次。 timer.schedule(task, delay) // delay 爲long類型:從現在起過delay毫秒執行一次 timer.schedule(task, delay, period) // delay爲long,period爲long:從現在起過delay毫秒以後,每隔period // 毫秒執行一次。
schedule()與scheduleAtFixedRate()的區別?
首先schedule(TimerTask task,Date time)與schedule(TimerTask task,long delay)都只是單次執行操作,並不存在多次調用任務的情況,所以沒有提供scheduleAtFixedRate方法的調用方式。它們實現的功能都一樣,那區別在哪裏呢?
(1)schedule()方法更注重保持間隔時間的穩定:保障每隔period時間可調用一次。
(2)scheduleAtFixedRate()方法更注重保持執行頻率的穩定:保障多次調用的頻率趨近於period時間,如果某一次調用時間大於period,下一次就會盡量小於period,以保障頻率接近於period。
3、示例演示
定製任務:
import java.util.Timer; import java.util.TimerTask; public class TimerTaskTest extends TimerTask{ @Override public void run() { // TODO Auto-generated method stub System.out.println("執行任務……"); } }
調用java.util.Timer:
import java.util.Timer; /** * 安排指定的任務task在指定的時間firstTime開始進行重複的固定速率period執行 * 每天中午12點都執行一次 */ public class Test { public static void main(String[] args){ Timer timer = new Timer(); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 12);//控制小時 calendar.set(Calendar.MINUTE, 0);//控制分鐘 calendar.set(Calendar.SECOND, 0);//控制秒 Date time = calendar.getTime();//執行任務時間爲12:00:00 Timer timer = new Timer(); //每天定時12:00執行操作,延遲一天後再執行 timer.schedule(new TimerTaskTest(), time, 1000 * 60 * 60 * 24); } }
結語:文中只是簡單的介紹了下java自帶的定時器工具類Timer,若有不足之處還望指出。有興趣者可以去查查看另一個定時器的開源項目:QUARTZ。 分享是一種快樂,堅持是一種精神。