使用方法
Timer是一個定時任務觸發裝置,設置任務,觸發延時和觸發間隔就可以定時執行任務。以下是個簡單的輸出任務,每隔1000ms執行一次。
public class TimerLearn { public static void main(String[] args) { Timer timer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println("timerTask"); } }; timer.schedule(timerTask, 0, 1000); } }
內部原理
Timer內部有個TimerThread線程,初始化的時候會開啟。TaskQueue隊列保存着任務,TaskQueue按執行時間進行堆排序。
public class Timer { private final TaskQueue queue = new TaskQueue(); private final TimerThread thread = new TimerThread(queue); public Timer() { this("Timer-" + serialNumber()); } public Timer(String name) { thread.setName(name); thread.start(); } }
TimerThread內部的隊列就是Timer里面隊列的引用,mainLoop是個死循環,不斷從queue里取最近的一個需要執行的。
public class TimerThread extends Thread { private TaskQueue queue; public void run() { try { mainLoop();//執行死循環 } finally { // Someone killed this Thread, behave as if Timer cancelled synchronized(queue) { newTasksMayBeScheduled = false; queue.clear(); // Eliminate obsolete references } } } private void mainLoop() { while (true) {
task = queue.getMin(); //循環從queue里取任務執行,如果沒有任務就進入阻塞 } } }
總結
Timer的實現原理簡單來說就是單線程+最小堆+任務輪詢