在executors
中提供了四種執行緒池:
newcachedthreadpool
可快取執行緒池,對於每個執行緒,如果有空閒執行緒可用,立即讓它執行,如果沒有,則建立乙個新執行緒
newfixedthreadpool
具有固定大小的執行緒池,如果任務數大於空閒的執行緒數,則把它們放進佇列中等待
newsinglethreadpool
大小為1的執行緒池,任務乙個接著乙個完成
newscheduledthreadpool
定長線程池,可控制線程最大併發數,支援定時及週期性任務執行,用來代替timer
在上文 中說到了callable不能直接被thread執行,但卻能被執行緒池執行,executorservice
提供了幾種方法執行乙個任務:
future submit(callable task);第乙個方法可以直接提交乙個callable任務,返回乙個包含結果的future submit(runnable task, t result);
future submit(runnable task);
future
,第二個方法會返回指定的result物件,第三個方法返回乙個future<?>
,可以使用這樣的物件來呼叫isdone
,cancel
,iscancelled
,但是在get的時候返回null。
此外,有兩個常用的關閉執行緒池的方法:
void shutdown();第乙個方法將啟動一次順序關閉,有任務在執行,則等待執行完成,但不接受新的任務;listshutdownnow()
第二個方法將取消所有未開始的任務並且試圖中斷正在執行的任務,返回從未開始執行的任務的列表。無法保證能夠停止正在處理的活動執行任務,但是會盡力嘗試。例如,通過thread.interrupt()
來取消典型的實現,所以任何任務無法響應中斷都可能永遠無法終止。
executorservice
提供了invokeany
和invokeall
方法,它們是批量執行的最常用形式,它們執行任務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
類中的靜態方法newcachedthreadpool
或newfixedthreadpool
建立執行緒池;
呼叫submit
提交runnable
或callable
任務;
如果想取消乙個任務,或者提交了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類構造器可以設定的引數 核心執行緒數 如果執行緒池中的執行緒數小於核心執行緒數,當新任務提交時,會新建乙個執行緒去處理該任務。最大執行緒數 如果執行緒池中的執行緒數大於等於核心執行緒數,但是小於最大執行緒數,當新任務提交時,會將任務加入任務佇列,如果任務佇列已...