Timer 的簡(jiǎn)單使用: 按照我的理解驯妄,Timer 相當(dāng)于一個(gè)線程任務(wù)調(diào)度器呈枉,new 一個(gè) Timer 并且設(shè)置它的 schedule 方法可以很方便地決定要執(zhí)行什么任務(wù)湿右,延遲多久才執(zhí)行钠导,每隔多長(zhǎng)時(shí)間后再一次執(zhí)行郎汪。
如何設(shè)置 Timer對(duì)象的 schedule 方法呢?
先來(lái)看到 schedule 方法的簽名:
public void schedule(@NotNull java.util.TimerTask task,
long delay,
long period)
參數(shù)理解
可以看到 schedule 方法的參數(shù)列表中:
第一個(gè)參數(shù)是一個(gè) TimerTask 類對(duì)象
第二個(gè)參數(shù)是 delay劝萤,
第三個(gè)參數(shù)是 period渊涝。
delay 和 period 的中文意思分別是 “延遲” 和 “周期”。而對(duì)于一個(gè)定時(shí)任務(wù)來(lái)講床嫌,“延遲”和“周期”是該定時(shí)任務(wù)的屬性跨释。決定了一個(gè)定時(shí)任務(wù)需要延遲多少毫秒(該參數(shù)的單位)開始執(zhí)行,以及循環(huán)執(zhí)行定時(shí)任務(wù)的周期大小厌处。
第一個(gè)參數(shù)對(duì)于初學(xué)者來(lái)講就略顯復(fù)雜了鳖谈。我自己也是剛剛接觸。TimerTask 本身是一個(gè)實(shí)現(xiàn)了Runnable接口的抽象類阔涉,有線程知識(shí)的同學(xué)都很清楚缆娃,在Runnable接口中,聲明了一個(gè)run()方法瑰排。這個(gè)方法是線程的執(zhí)行任務(wù)單元贯要。當(dāng)一個(gè)線程啟動(dòng)之后,要完成的工作就是去執(zhí)行run()方法椭住。
而TimerTask抽象類實(shí)現(xiàn)了Runnable接口崇渗,所以TimerTask也存在 run() 方法。 run()方法是線程要執(zhí)行的任務(wù),所以將這個(gè)任務(wù)交給定時(shí)器的schedule方法京郑。
然后這個(gè)定時(shí)器在底層會(huì)在延遲時(shí)間結(jié)束后宅广,啟動(dòng)這個(gè)線程任務(wù), 并且周期性循環(huán)些举。
代碼實(shí)例:
/*
*測(cè)試定時(shí)器
* */
@Autowired
private ProductTimerTask productTimerTask = null; // 定義一個(gè)ProductTimerTask對(duì)象
@Test
public void test8 () {
new Timer(false).schedule(new TimerTask() {
@Override
public void run() {
System.out.println("讀取數(shù)據(jù)庫(kù)數(shù)據(jù)");
}
}, 0, 1000);
for (int i=0; i<5; i++) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
上面程序中跟狱,Thread.sleep(2000)的存在是為了延長(zhǎng)測(cè)試方法的生命周期,使得定時(shí)器的效果得以體現(xiàn)户魏,即每隔1秒往控制臺(tái)輸出1條信息兽肤。
(end)