任務調度之Timer與TimerTask配合
阿新 • • 發佈:2019-04-11
所有 size ont -s timertask [] 守護線程 cancel 安全
什麽是任務調度?
在實際業務中,我們經常需要定時、定期、或者多次完成某些任務,對這些任務進行管理,就是任務調度。任務調度與多線程密切相關。
任務調度有多種方式
Timer與TimerTask配合
Timer 定時器,能在主線程外另起線程完成任務。
TimerTask 實現Runnable接口的抽象類,相當於一個任務。
來一個簡單的例子:
import java.util.Timer; import java.util.TimerTask; public class TestTimer { public static void main(String args[]){new Reminder(3); System.out.println("調度完成。"); } public static class Reminder{ Timer timer; public Reminder(int sec){ timer = new Timer();
//開始調度任務 timer.schedule(new TimerTask(){ public void run(){ System.out.println("時間到!");
//重要:終止內部線程! timer.cancel(); } }, sec*1000); } } }
會輸出:
調度完成。
時間到!
原理:Timer的構造函數裏會起一個單獨的線程(new Thread())來執行計劃任務,並在任務完成後結束線程。
Timer如何終止內部線程?
1、調用timer的cancle方法(最常用,如上例)
2、把timer線程設置成daemon線程,(new Timer(true)創建daemon線程),在jvm裏,如果所有用戶線程結束,那麽守護線程也會被終止,不過這種方法一般不用。
3、當所有任務執行結束後,刪除對應timer對象的引用,線程也會被終止。
4、調用System.exit方法終止程序
註意點:
1、每一個Timer僅對應唯一一個線程。
2、Timer不保證任務執行的十分精確。
3、Timer類的線程安全的。
任務調度之Timer與TimerTask配合