什么是任務調度?
在實際業務中,我們經常需要定時、定期、或者多次完成某些任務,對這些任務進行管理,就是任務調度。任務調度與多線程密切相關。
任務調度有多種方式
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類的線程安全的。