【java】定时器
?
總結
1、執行計劃的任務放在TimerTask的子類中,由Timer進行該任務。
2、創建一個Timer就是啟動一個新的線程,直至Timer里的任務執行完畢,才會結束。希望創建的線程為守護線程,則創建時需設置Timer timer=new Timer(true);
3、執行任務的時間早于當前時間,任務會立即執行。
4、TimerTask是以隊列的方式一個個順序執行的。當前面的任務消耗時間較長,則后面的任務運行的時間也會延后。
比如,假定Task1執行需2s,Task2在Task1開始之后1s需被執行。結果是執行完Task1后,立即執行Task2。(實際也符合第3點)
5、如果沒有延遲,則執行任務的時間是上一次任務開始的時間加上poried的時間。如果延遲了,則執行任務的時間為上一個任務的結束時間。(補充第4條)
6、方法schedule和scheduleAtFixedRate的區別在于后者有追趕執行性。(下面由代碼解釋)
7、異常方面。如果timer中執行任務時發生異常,則結束該timer線程,不會在執行任何任務。
?
常用例子
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("當前時間:"+new Date());//執行計劃的任務放在TimerTask的子類中,由Timer進行該任務。Timer timer = new Timer();//創建一個任務,1s后開始執行,并此后每隔2s執行。timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(new Date() + "任務一");}},1000,2000);//創建一個任務,十天后執行。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() + "任務二");}},runDate);//timer.cancel(); 調用TImer的cancel()方法會清空該TImer的所有任務。//timerTask.cancel(); 調用TImerTask的cancel()方法則會在TImer中取消該任務。 } }?2、方法schedule和scheduleAtFixedRate的區別在于后者有追趕執行性。
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("當前時間:"+new Date());Calendar calendar=Calendar.getInstance();calendar.add(Calendar.SECOND,-100); //設置一個比較早的時間Date earlyDate = calendar.getTime();Timer timer = new Timer();System.out.printf(new Date() + " 現在開始執行任務");timer.scheduleAtFixedRate(new TimerTask() {@Overridepublic void run() {System.out.println(new Date() + " 任務一");}},earlyDate,5000);/*timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(new Date() + " 任務一");}},earlyDate,5000);*/} }?
// schedule方法的輸出(注意比對執行任務的時間) ? ? ? ? ? ? ? ?//scheduleAtFixedRate方法的輸出
? ? ?
解釋:當執行任務的時間早于當前時間時,比如示例中,執行任務的時間早于當前任務100s,那么這段時間理論應該有的任務怎么處理呢?
schedule選擇拋棄不理,以當前的時間為新的起點,而scheduleAtFiexdRate則會一口氣將這些任務順序都執行完畢。
?
轉載于:https://www.cnblogs.com/zadomn0920/p/java.html
總結
- 上一篇: Android 浏览器 —— 使用 We
- 下一篇: js多文件上传