Azureus原始碼剖析(四)

2021-08-23 15:01:25 字數 2499 閱讀 9331

aethread只是乙個簡單的執行緒類,提供乙個抽象方法runsupport 供我們重寫,相必之下,aethread2有幾個改進的地方:1)加入了執行鎖機制,執行執行緒和等待執行緒的結束這兩個操作需要爭搶執行鎖,若鎖未放開,則說明執行緒還在執行,必須等待鎖的釋放。2)設定了乙個守護執行緒鍊錶,若待建立的執行緒是守護執行緒,當鍊表為空時,新建乙個守護執行緒加入表尾,否則從鍊錶尾部取乙個執行緒節點來使用,類似執行緒池。3)對於守護執行緒,若活躍時間超過時限,就會從守護執行緒鍊錶中刪除頭部節點,即超時最長時間的節點。

public

abstract

class

aethread2

private

static

long

last_timeout_check;

//最近的超時檢查時間

private

static

long

total_starts;

//啟動的執行緒總數

private

static

long

total_creates;

//建立的執行緒總數

private

//執行緒包裝器(實質的執行緒)

private

stringname;

//執行緒名稱

private

boolean

daemon;

//是否守護執行緒

private

intpriority

=thread.norm_priority;

//執行緒優先順序

private

volatile

joinlocklock

=new

joinlock();

public

aethread2(string_name,

boolean

_daemon)

public

void

start()

if(daemon)

else

if(priority

!=//

設定執行緒優先順序

=newlock;

//傳遞鎖

this

,name);

//真正啟動執行緒執行

}public

void

setpriority(

int_priority)

public

void

interrupt()

else

//中斷執行緒}}

public

boolean

iscurrentthread()

public

stringtostring()

else

public

static

void

setourthread()

public

static

void

setourthread(threadthread)

//實質的執行緒,從thread類繼承

protected

static

class

extends

thread

public

void

run()

finally}}

else

}catch

(throwablee)

finally}if

(isinterrupted()||!

thread.currentthread().isdaemon())

else

else}}

if(daemon_threads.size()

>=

max_retained)

daemon_threads.addlast(

this

);//

將此守護節點加入守護執行緒鍊錶尾部,這樣頭部應該是最先超時的節點

setname(

"aethead2:parked["+

daemon_threads.size()+"

]");//

system.out.println("aethread2:queue="+daemon_threads.size()+",creates="+total_creates+",starts="+total_starts);

}sem.reserve();

//新加入節點訊號量增加

if(target

==null)}

}}protected

void

start(aethread2_target,string_name)

else

}protected

void

retire()

}public

void

join()

catch

(interruptedexceptione){}}}

}}

Azureus原始碼剖析(四)

aethread只是乙個簡單的執行緒類,提供乙個抽象方法runsupport 供我們重寫,相必之下,aethread2有幾個改進的地方 1 加入了執行鎖機制,執行執行緒和等待執行緒的結束這兩個操作需要爭搶執行鎖,若鎖未放開,則說明執行緒還在執行,必須等待鎖的釋放。2 設定了乙個守護執行緒鍊錶,若待建...

Azureus原始碼剖析(三)

接著第一篇 的工作,本篇繼續分析種子檔案監聽伺服器的實現細節。先簡單描述下其工作流程,首先伺服器在 6880 埠處開啟乙個套接字監聽,然後開啟乙個守護執行緒用於處理到來的 開啟種子檔案列表 請求,在這個服務執行緒中不斷迴圈讀取來自客戶的請求,對 torrent 檔案列表進行解析。如果此時 azure...

原始碼剖析 Hashtable 原始碼剖析

hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...