【java】定时器
?
總結(jié)
1、執(zhí)行計(jì)劃的任務(wù)放在TimerTask的子類(lèi)中,由Timer進(jìn)行該任務(wù)。
2、創(chuàng)建一個(gè)Timer就是啟動(dòng)一個(gè)新的線程,直至Timer里的任務(wù)執(zhí)行完畢,才會(huì)結(jié)束。希望創(chuàng)建的線程為守護(hù)線程,則創(chuàng)建時(shí)需設(shè)置Timer timer=new Timer(true);
3、執(zhí)行任務(wù)的時(shí)間早于當(dāng)前時(shí)間,任務(wù)會(huì)立即執(zhí)行。
4、TimerTask是以隊(duì)列的方式一個(gè)個(gè)順序執(zhí)行的。當(dāng)前面的任務(wù)消耗時(shí)間較長(zhǎng),則后面的任務(wù)運(yùn)行的時(shí)間也會(huì)延后。
比如,假定Task1執(zhí)行需2s,Task2在Task1開(kāi)始之后1s需被執(zhí)行。結(jié)果是執(zhí)行完Task1后,立即執(zhí)行Task2。(實(shí)際也符合第3點(diǎn))
5、如果沒(méi)有延遲,則執(zhí)行任務(wù)的時(shí)間是上一次任務(wù)開(kāi)始的時(shí)間加上poried的時(shí)間。如果延遲了,則執(zhí)行任務(wù)的時(shí)間為上一個(gè)任務(wù)的結(jié)束時(shí)間。(補(bǔ)充第4條)
6、方法schedule和scheduleAtFixedRate的區(qū)別在于后者有追趕執(zhí)行性。(下面由代碼解釋)
7、異常方面。如果timer中執(zhí)行任務(wù)時(shí)發(fā)生異常,則結(jié)束該timer線程,不會(huì)在執(zhí)行任何任務(wù)。
?
常用例子
1、示例
import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; /*** Created by zay on 2016/12/8.*/public class TimerTest {public static void main(String[] args) {System.out.println("當(dāng)前時(shí)間:"+new Date());//執(zhí)行計(jì)劃的任務(wù)放在TimerTask的子類(lèi)中,由Timer進(jìn)行該任務(wù)。Timer timer = new Timer();//創(chuàng)建一個(gè)任務(wù),1s后開(kāi)始執(zhí)行,并此后每隔2s執(zhí)行。timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(new Date() + "任務(wù)一");}},1000,2000);//創(chuàng)建一個(gè)任務(wù),十天后執(zhí)行。Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE,1);Date runDate = calendar.getTime();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(new Date() + "任務(wù)二");}},runDate);//timer.cancel(); 調(diào)用TImer的cancel()方法會(huì)清空該TImer的所有任務(wù)。//timerTask.cancel(); 調(diào)用TImerTask的cancel()方法則會(huì)在TImer中取消該任務(wù)。 } }?2、方法schedule和scheduleAtFixedRate的區(qū)別在于后者有追趕執(zhí)行性。
import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask;/*** Created by zay on 2016/12/8.*/ public class TimerTest {public static void main(String[] args) {System.out.println("當(dāng)前時(shí)間:"+new Date());Calendar calendar=Calendar.getInstance();calendar.add(Calendar.SECOND,-100); //設(shè)置一個(gè)比較早的時(shí)間Date earlyDate = calendar.getTime();Timer timer = new Timer();System.out.printf(new Date() + " 現(xiàn)在開(kāi)始執(zhí)行任務(wù)");timer.scheduleAtFixedRate(new TimerTask() {@Overridepublic void run() {System.out.println(new Date() + " 任務(wù)一");}},earlyDate,5000);/*timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(new Date() + " 任務(wù)一");}},earlyDate,5000);*/} }?
// schedule方法的輸出(注意比對(duì)執(zhí)行任務(wù)的時(shí)間) ? ? ? ? ? ? ? ?//scheduleAtFixedRate方法的輸出
? ? ?
解釋:當(dāng)執(zhí)行任務(wù)的時(shí)間早于當(dāng)前時(shí)間時(shí),比如示例中,執(zhí)行任務(wù)的時(shí)間早于當(dāng)前任務(wù)100s,那么這段時(shí)間理論應(yīng)該有的任務(wù)怎么處理呢?
schedule選擇拋棄不理,以當(dāng)前的時(shí)間為新的起點(diǎn),而scheduleAtFiexdRate則會(huì)一口氣將這些任務(wù)順序都執(zhí)行完畢。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zadomn0920/p/java.html
總結(jié)
- 上一篇: Android 浏览器 —— 使用 We
- 下一篇: js多文件上传