Timer實現原理


使用方法

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的實現原理簡單來說就是單線程+最小堆+任務輪詢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM