java執行緒池的基本使用

2021-09-20 02:51:31 字數 2683 閱讀 8891

executors中提供了四種執行緒池:

newcachedthreadpool可快取執行緒池,對於每個執行緒,如果有空閒執行緒可用,立即讓它執行,如果沒有,則建立乙個新執行緒

newfixedthreadpool具有固定大小的執行緒池,如果任務數大於空閒的執行緒數,則把它們放進佇列中等待

newsinglethreadpool大小為1的執行緒池,任務乙個接著乙個完成

newscheduledthreadpool定長線程池,可控制線程最大併發數,支援定時及週期性任務執行,用來代替timer

在上文 中說到了callable不能直接被thread執行,但卻能被執行緒池執行,executorservice提供了幾種方法執行乙個任務:

future submit(callable task);

future submit(runnable task, t result);

future submit(runnable task);

第乙個方法可以直接提交乙個callable任務,返回乙個包含結果的future,第二個方法會返回指定的result物件,第三個方法返回乙個future<?>,可以使用這樣的物件來呼叫isdone,cancel,iscancelled,但是在get的時候返回null。

此外,有兩個常用的關閉執行緒池的方法:

void shutdown();

listshutdownnow()

第乙個方法將啟動一次順序關閉,有任務在執行,則等待執行完成,但不接受新的任務;

第二個方法將取消所有未開始的任務並且試圖中斷正在執行的任務,返回從未開始執行的任務的列表。無法保證能夠停止正在處理的活動執行任務,但是會盡力嘗試。例如,通過thread.interrupt()來取消典型的實現,所以任何任務無法響應中斷都可能永遠無法終止。

executorservice提供了invokeanyinvokeall方法,它們是批量執行的最常用形式,它們執行任務collection,然後等待至少乙個,或全部任務完成

/**

執行給定的任務,當所有任務完成時,返回保持任務狀態和結果的 future 列表。返回列表的所有元素的 future.isdone() 為 true。

注意,可以正常地或通過丟擲異常來終止已完成任務。

**/list> invokeall(collection<? extends callable> tasks)

throws interruptedexception

/**執行給定的任務,如果其中乙個任務的結果。一旦正常或異常返回後,則取消尚未完成的任務。

**/

t invokeany(collection<? extends callable> tasks)

throws interruptedexception,

executionexception

invokeany方法提交所有任務到乙個callable物件的集合中,並且返回某個已經完成了的任務的結果,返回的任務是不確定的。invokeall方法則返回所有任務的結果,可以這樣來對結果進行處理:

list> tasks=...

list> results = executor.invokeall(tasks);

for(futureresult : results)

...

這樣處理的乙個弊端是,如果第乙個任務花費了很長時間,則不得不等待。在某些情況下,可能只需要乙個任務出了結果就可以中止所有任務,這樣就得不償失。將結果按照可獲得的順序儲存起來可能更好,這時需要用到executorcompletionservice來進行排列:

executorcompletionservice service = new executorcompletionservice(executor);

for(callabletask:tasks)

for(int i = 0;i < task.size();i++)

...

其中,take()方法會移除下乙個已經完成的結果(future),如果沒有可用結果則阻塞

在使用執行緒池時,大多應該按照以下步驟:

呼叫executors類中的靜態方法newcachedthreadpoolnewfixedthreadpool建立執行緒池;

呼叫submit提交runnablecallable任務;

如果想取消乙個任務,或者提交了callable物件,那就要儲存好返回的future物件;

當不再提交任務時,呼叫shutdown

java執行緒池使用

newcachedthreadpool newfixedthreadpool newscheduledthreadpool newsinglethreadexecutor 單例物件中的執行緒池使用 建立乙個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活 空閒執行緒,若無可 則新建執行緒 exe...

執行緒池的基本使用

import time 使用單執行緒序列方式執行 def get page str time.sleep 2 name list aa bb cc dd start time time.time for i in range len name list get page name list i en...

Java中線程池的使用

1 threadpoolexecutor類構造器可以設定的引數 核心執行緒數 如果執行緒池中的執行緒數小於核心執行緒數,當新任務提交時,會新建乙個執行緒去處理該任務。最大執行緒數 如果執行緒池中的執行緒數大於等於核心執行緒數,但是小於最大執行緒數,當新任務提交時,會將任務加入任務佇列,如果任務佇列已...