天天看點

java android ExecutorService 線程池解析

executorservice:

它也是一個接口,它擴充自executor接口,executor接口更像一個抽象的指令模式,僅有一個方法:execute(runnable);executor接口簡單,但是很重要,重要在這種設計的模式上。。java5以後,通過executor來啟動線程比用thread的start()更好。在新特征中,可以很容易控制線程的啟動、執行和關閉過程,還可以很容易使用線程池的特性。

幾種不同的executorservice線程池對象 

1.newcachedthreadpool() 

-緩存型池子,先檢視池中有沒有以前建立的線程,如果有,就reuse.如果沒有,就建一個新的線程加入池中 

-能reuse的線程,必須是timeout idle内的池中線程,預設timeout是60s,超過這個idle時長,線程執行個體将被終止及移出池。 

  注意,放入cachedthreadpool的線程不必擔心其結束,超過timeout不活動,其會自動被終止。 

2. newfixedthreadpool 

-newfixedthreadpool與cachethreadpool差不多,也是能reuse就用,但不能随時建新的線程 

-其獨特之處:任意時間點,最多隻能有固定數目的活動線程存在,此時如果有新的線程要建立,隻能放在另外的隊列中等待,直到目前的線程中某個線程終止直接被移出池子 

-和cachethreadpool不同,fixedthreadpool沒有idle機制(可能也有,但既然文檔沒提,肯定非常長,類似依賴上層的tcp或udp idle機制之類的),是以fixedthreadpool多數針對一些很穩定很固定的正規并發線程,多用于伺服器 

-從方法的源代碼看,cache池和fixed 池調用的是同一個底層池,隻不過參數不同: 

fixed池線程數固定,并且是0秒idle(無idle) 

cache池線程數支援0-integer.max_value(顯然完全沒考慮主機的資源承受能力),60秒idle  

3.scheduledthreadpool 

-排程型線程池 

-這個池子裡的線程可以按schedule依次delay執行,或周期執行 

4.singlethreadexecutor 

-單例線程,任意時間池中隻能有一個線程 

-用的是和cache池和fixed池相同的底層池,但線程數目是1-1,0秒idle(無idle) 

1、executorservice:

是一個接口,繼承了executor:

2、executor:

而executor亦是一個接口,該接口隻包含了一個方法:

3、executors:

該類是一個輔助類,此包中所定義的 executor、executorservice、scheduledexecutorservice、threadfactory 和 callable 類的工廠和實用方法。

此類支援以下各種方法:

? 建立并傳回設定有常用配置字元串的 executorservice 的方法。

? 建立并傳回設定有常用配置字元串的 scheduledexecutorservice 的方法。

? 建立并傳回“包裝的”executorservice 方法,它通過使特定于實作的方法不可通路來禁用重新配置。

? 建立并傳回 threadfactory 的方法,它可将新建立的線程設定為已知的狀态。

? 建立并傳回非閉包形式的 callable 的方法,這樣可将其用于需要 callable 的執行方法中。

4、建立executorservice的方法:

建立一個可重用固定線程數的線程池,以共享的無界隊列方式來運作這些線程。

5、executorservice的方法:

<dl></dl>

<dd></dd>

啟動一次順序關閉,執行以前送出的任務,但不接受新任務。如果已經關閉,則調用沒有其他作用。 

<dt>抛出:</dt>

<code>securityexception</code> - 如果安全管理器存在并且關閉,此 executorservice 可能操作某些不允許調用者修改的線程(因為它沒有保持 ("modifythread")),或者安全管理器的 checkaccess 方法拒絕通路。

啟動一次順序關閉,執行以前送出的任務,但不接受新任務。如果已經關閉,則調用沒有其他作用。

請求關閉、發生逾時或者目前線程中斷,無論哪一個首先發生之後,都将導緻阻塞,直到所有任務完成執行。 

<dt>參數:</dt>

<code>timeout</code> - 最長等待時間

<code>unit</code> - timeout 參數的時間機關

<dt>傳回:</dt>

<dd>如果此執行程式終止,則傳回 true;如果終止前逾時期滿,則傳回 false</dd>

<code>interruptedexception</code> - 如果等待時發生中斷

請求關閉、發生逾時或者目前線程中斷,無論哪一個首先發生之後,都将導緻阻塞,直到所有任務完成執行。既是等待所有子線程執行結束。

在未來某個時間執行給定的指令。該指令可能在新的線程、已入池的線程或者正調用的線程中執行,這由 executor實作決定。 

<code>command</code> - 可運作的任務

<code>rejectedexecutionexception</code> - 如果不能接受執行此任務。

<code>nullpointerexception</code> - 如果指令為 null

在未來某個時間執行給定的指令。該指令可能在新的線程、已入池的線程或者正調用的線程中執行,這由 executor 實作決定。

送出一個 runnable 任務用于執行,并傳回一個表示該任務的 future。該 future 的 get 方法在成功 完成時将會傳回null。 

<code>task</code> - 要送出的任務

<dd>表示任務等待完成的 future</dd>

<code>rejectedexecutionexception</code> - 如果任務無法安排執行

<code>nullpointerexception</code> - 如果該任務為 null

送出一個 runnable 任務用于執行,并傳回一個表示該任務的 future。該 future 的 get 方法在成功 完成時将會傳回 null。

6、下面是相關的使用例子:

可以發現線程被循環建立,但是啟動線程卻不是連續的,而是由executorservice決定的。

參考:

如有問題請留言,轉載注明出處。