Timer 的簡單使用: 按照我的理解,Timer 相當于一個線程任務調度器,new 一個 Timer 并且設置它的 schedule 方法可以很方便地決定要執(zhí)行什么任務,延遲多久才執(zhí)行,每隔多長時間后再一次執(zhí)行。
如何設置 Timer對象的 schedule 方法呢?
先來看到 schedule 方法的簽名:
public void schedule(@NotNull java.util.TimerTask task,
long delay,
long period)
參數理解
可以看到 schedule 方法的參數列表中:
第一個參數是一個 TimerTask 類對象
第二個參數是 delay,
第三個參數是 period。
delay 和 period 的中文意思分別是 “延遲” 和 “周期”。而對于一個定時任務來講,“延遲”和“周期”是該定時任務的屬性。決定了一個定時任務需要延遲多少毫秒(該參數的單位)開始執(zhí)行,以及循環(huán)執(zhí)行定時任務的周期大小。
第一個參數對于初學者來講就略顯復雜了。我自己也是剛剛接觸。TimerTask 本身是一個實現了Runnable接口的抽象類,有線程知識的同學都很清楚,在Runnable接口中,聲明了一個run()方法。這個方法是線程的執(zhí)行任務單元。當一個線程啟動之后,要完成的工作就是去執(zhí)行run()方法。
而TimerTask抽象類實現了Runnable接口,所以TimerTask也存在 run() 方法。 run()方法是線程要執(zhí)行的任務,所以將這個任務交給定時器的schedule方法。
然后這個定時器在底層會在延遲時間結束后,啟動這個線程任務, 并且周期性循環(huán)。
代碼實例:
/*
*測試定時器
* */
@Autowired
private ProductTimerTask productTimerTask = null; // 定義一個ProductTimerTask對象
@Test
public void test8 () {
new Timer(false).schedule(new TimerTask() {
@Override
public void run() {
System.out.println("讀取數據庫數據");
}
}, 0, 1000);
for (int i=0; i<5; i++) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
上面程序中,Thread.sleep(2000)的存在是為了延長測試方法的生命周期,使得定時器的效果得以體現,即每隔1秒往控制臺輸出1條信息。
(end)