Azureus原始碼剖析(三)

2021-05-07 09:57:51 字數 2955 閱讀 4933

接著第一篇

的工作,本篇繼續分析種子檔案監聽伺服器的實現細節。

先簡單描述下其工作流程,首先伺服器在

6880

埠處開啟乙個套接字監聽,然後開啟乙個守護執行緒用於處理到來的

「開啟種子檔案列表

」請求,在這個服務執行緒中不斷迴圈讀取來自客戶的請求,對

torrent

檔案列表進行解析。如果此時

azureus

的各個元件都已經建立完畢,則說明

azureus

的核心處理元件可用,則直接對

torrent

檔案列表進行處理,否則,先將

torrent

檔案列表加入種子檔案佇列中,等到各個元件建立完畢後再來處理種子佇列中的各個種子檔案。

下面來檢視其源**,先看其成員變數:

private

serversocket socket;

//伺服器套接字

private

intstate;

//伺服器當前狀態

private

boolean

bcontinue;

//服務執行緒是否繼續執行

public

static

final

intstate_faulty =0

;//錯誤狀態

public

static

final

intstate_listening =1

;//監聽狀態

protected

list queued_torrents 

=new

arraylist();

//待解析種子檔案佇列,這裡並沒有考慮同步互斥的問題

protected

boolean

core_started    

=false;//

核心處理元件是否已經啟動

在其建構函式中完成伺服器的建立和啟動:

socket 

=new

serversocket(

6880

, 50

, inetaddress.getbyname(

"127.0.0.1

")); 

//nolar: only bind to localhost

state 

=state_listening;

//設定伺服器狀態為「監聽」 而在

pollforconnections

中為azureus

新增了乙個生命週期***,這樣當其所有元件完成時就會通知此***,而後者會呼叫

openqueuedtorrents

方法,對待解析種子檔案佇列中排隊的種子檔案進行處理,此外,這個方法中還建立了乙個守護執行緒用於處理到來的開啟種子檔案列表請求,實際的處理工作在

pollforconnectionssupport

方法中完成:

public

void

pollforconnections(

final

azureuscore azureus_core )

}});

if( socket 

!=null)};

t.setdaemon(

true

);t.start(); 

//啟動執行緒}}

這裡執行緒的中斷採用設定執行標誌的方式,我覺得這並不是乙個很好的解決方案,因為若執行緒要完成的工作十分耗時,則執行緒的中斷就不能立即見效。更好的辦法應該是

interrupt

方法和中斷標誌混合起來使用。

private

void

pollforconnectionssupport(azureuscore azureus_core) 

logger.log(

newlogevent(logid, 

"main::startserver: decoded to '"+

debug_str +"

'"));processargs(azureus_core,args); 

//處理解析出的種子檔案列表}}

}sck.close();

}catch

(exception e) 

finally

catch

(exception e) }}

} 在種子檔案列表解析成功後,對其處理要分情況考慮,若處理核心還未啟動,則將其加入種子佇列中排隊等待,否則直接對其解析處理。

try);//

加入種子檔案佇列中

queued 

=true;}

}finally

if( 

!queued )

具體的處理工作由

handlefile

完成,其中呼叫了

opentorrent

方法來開啟種子檔案,具體的種子檔案解析見

第二篇文章。

protected

void

handlefile(azureuscore    azureus_core,string file_name,

boolean

open )

else

else}} 

catch

(throwable e)}

當azureus

生命週期來到各個元件都建立完畢時,會通知其監聽者,從而呼叫

openqueuedtorrents

方法來處理排隊中的種子檔案

protected

void

openqueuedtorrents(azureuscore azureus_core )

finally

//處理種子佇列中的種子檔案

for(

inti=0

;i<

queued_torrents.size();i++)

}

Azureus原始碼剖析(四)

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

Azureus原始碼剖析(四)

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

原始碼剖析 Hashtable 原始碼剖析

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