Java Timer原始碼解析(定時器原始碼解析)

2021-08-29 12:06:10 字數 1848 閱讀 2709

timer顧名思義就是定時器,用於處理一些需要延時處理的任務,延時時間可能是1s,也可能是5天。

一般使用方式如下:

timertask task = new timertask() 

};timer timer = new timer();

timer.schedule(task, new date(), 1000);

從上面**看來,主要是timer這個類,首先看一下timer的初始化:

public timer()
public timer(string name)
private final timerthread thread = new timerthread(queue);
由上面**,我們可以知道,timer初始化其實就是start了timerthread這個執行緒,於是我們看一下這個執行緒做的工作:

public void run()  finally }}

private void mainloop()

currenttime = system.currenttimemillis();

executiontime = task.nextexecutiontime;

if (taskfired = (executiontime<=currenttime)) else }}

if (!taskfired) // task hasn't yet fired; wait

queue.wait(executiontime - currenttime);

}if (taskfired) // task fired; run it, holding no locks

task.run();

} catch(interruptedexception e)

}}

**不長,也比較容易看懂:

1、檢視任務佇列是否為空,如果為空就阻塞住。

2、獲取佇列中等待時間最少的乙個,檢視其狀態是否已被關閉以及是否需要重複執行。

3、如果任務沒有被取消,不需要移除佇列。那麼就判斷其需要執行的時間是否小於等於當前時間,如果小於等於,就通過wait等待到該時間執行,如果大於,那麼就直接run執行。

定時器每次都會觸發時間最小的那個任務,這種取極值的情況用堆非常的合適。

使用堆結構主要快在新增和刪除,其效能都是log(n)。

也就是說在1000個任務的堆中新增和刪除操作都能在10次對比以內完成。

原始碼如下:

class taskqueue 

void add(timertask task)

timertask getmin()

timertask get(int i)

void removemin()

void quickremove(int i)

void reschedulemin(long newtime)

boolean isempty()

void clear()

private void fixup(int k)

}private void fixdown(int k)

}void heapify()

}

timer原始碼中的堆實現非常基礎,主要是兩個方法,fixup()和fixdown(),即上公升和下沉。

fixup:為了保證堆結構,在addtask的時候會使用到上公升。

fixdown:在取出最小值的時候,會把堆的最後乙個節點放到堆頂,然後執行下沉操作,從而繼續保證堆結構,將堆中剩餘的值的最小值放到堆頂。

Fabric 原始碼解析 原始碼目錄解析

這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...

Integer原始碼解析

public class test else integer i3 200 integer i4 200 if i3 i4 else 結果為 原因integer 類會快取 128 到 127 之間的整數 但是如果new interger的話就是不同的物件了 源 分析 如果是在 128到正的127之間...