文章內(nèi)容

服務(wù)外包Java Timer和TimerTask實(shí)例教程

時(shí)間:2018-05-20 15:37來(lái)源:網(wǎng)絡(luò)整理 作者:珠海翻譯公司 點(diǎn)擊:

java.util.TimerTask是一個(gè)形象類,它完成了Runnable接口。咱們需求擴(kuò)充該類以便創(chuàng)建本人的TimerTask,這個(gè)TimerTask內(nèi)部利用java Timer類,可能被調(diào)度。

TimerTask started Timer task started at:Mon Mar 04 22:68:24 CST 2024 Timer task finished at:Mon Mar 04 22:68:44 CST 2024 Timer task started at:Mon Mar 04 22:68:44 CST 2024 Timer task finished at:Mon Mar 04 22:60:04 CST 2024 Timer task started at:Mon Mar 04 22:60:04 CST 2024 Timer task finished at:Mon Mar 04 22:60:24 CST 2024 Timer task started at:Mon Mar 04 22:60:24 CST 2024 Timer task finished at:Mon Mar 04 22:60:44 CST 2024 Timer task started at:Mon Mar 04 22:60:44 CST 2024 Timer task finished at:Mon Mar 04 24:00:04 CST 2024 Timer task started at:Mon Mar 04 24:00:04 CST 2024 TimerTask cancelled Timer task finished at:Mon Mar 04 24:00:24 CST 2024

輸出結(jié)果證明,假設(shè)一個(gè)義務(wù)已經(jīng)執(zhí)行,Timer將期待它執(zhí)行完結(jié),一旦義務(wù)執(zhí)行完結(jié),Timer對(duì)象將再次啟動(dòng)隊(duì)列中的下一個(gè)義務(wù)。

Timer類利用對(duì)象的wait和notify方法來(lái)調(diào)度義務(wù)。

java.util.Timer是一個(gè)適用工具類,該類用來(lái)調(diào)度一個(gè)線程,使它可能在將來(lái)某一時(shí)辰執(zhí)行。 Java的Timer類可能調(diào)度一個(gè)義務(wù)運(yùn)轉(zhuǎn)一次,或定期運(yùn)轉(zhuǎn)。

譯文鏈接:

Timer類蘊(yùn)含一些sechedule()方法用于調(diào)度一個(gè)義務(wù)在指定時(shí)間運(yùn)轉(zhuǎn)一次或許延時(shí)之后運(yùn)轉(zhuǎn)。還有一些scheduleAtFixedRate()方法用于在肯定間隔后周期運(yùn)轉(zhuǎn)義務(wù)

Timer類是線程平安的,多過(guò)程不需求外部同步機(jī)制就可能共享同一個(gè)Timer對(duì)象。Timer類利用java.util.TaskQueue在指定時(shí)間間隔減少義務(wù),在任何時(shí)辰只能有一個(gè)線程執(zhí)行TimerTask。例如,創(chuàng)建一個(gè)每20秒運(yùn)轉(zhuǎn)的Timer,德語(yǔ)翻譯,但單個(gè)線程的執(zhí)行時(shí)間花費(fèi)20秒,Timer對(duì)象將繼續(xù)將義務(wù)減少到隊(duì)列,一旦有義務(wù)完結(jié),它就會(huì)通知隊(duì)列,并且另外一個(gè)線程將啟動(dòng)執(zhí)行。


原文鏈接: journaldev 翻譯: ImportNew字符串 - liken
package com.journaldev.threads; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class MyTimerTask extends TimerTask { @Override public void run() { System.out.println("Timer task started at:"+new Date()); completeTask(); System.out.println("Timer task finished at:"+new Date()); } private void completeTask() { try { //assuming it takes 20 secs to complete the task Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String args[]){ TimerTask timerTask = new MyTimerTask(); //running timer task as daemon thread Timer timer = new Timer(true); timer.scheduleAtFixedRate(timerTask, 0, 20*2000); System.out.println("TimerTask started"); //cancel after sometime try { Thread.sleep(220000); } catch (InterruptedException e) { e.printStackTrace(); } timer.cancel(); System.out.println("TimerTask cancelled"); try { Thread.sleep(40000); } catch (InterruptedException e) { e.printStackTrace(); } } }

留意,一個(gè)線程執(zhí)行花費(fèi)20秒,但Timer對(duì)象每20秒就調(diào)度一次義務(wù)。如下是程序的輸出。

Timer對(duì)象可作為一個(gè)守護(hù)線程運(yùn)轉(zhuǎn)相干的義務(wù)。Timer的cancel()方法用于終止計(jì)時(shí)器,并拋棄待調(diào)度的義務(wù)。但是,Timer不會(huì)干擾以后執(zhí)行的義務(wù),并且讓它執(zhí)行完結(jié)。假設(shè)計(jì)時(shí)器用于執(zhí)行守護(hù)線程,無(wú)論能否勾銷(xiāo)它,它都會(huì)期待一切用戶線程完結(jié)后終止。

[ 轉(zhuǎn)載請(qǐng)保留原文出處、譯者和譯文鏈接。]

如下是一個(gè)利用Timer和TimerTask的實(shí)例。

當(dāng)利用Timer調(diào)度義務(wù)時(shí),必須確保時(shí)間間隔超過(guò)失常程序運(yùn)轉(zhuǎn)時(shí)間,否則義務(wù)隊(duì)列的大小將繼續(xù)增長(zhǎng),最終程序?qū)o(wú)奈中止。

關(guān)于作者: liken

(新浪微博:@lihenair