摘要:此外,有兩個常用的關閉線程池的方法第一個方法將啟動一次順序關閉,有任務在執行,則等待執行完成,但不接受新的任務第二個方法將取消所有未開始的任務并且試圖中斷正在執行的任務,返回從未開始執行的任務的列表。
四種線程池
在Executors中提供了四種線程池:
newCachedThreadPool 可緩存線程池,對于每個線程,如果有空閑線程可用,立即讓它執行,如果沒有,則創建一個新線程
newFixedThreadPool 具有固定大小的線程池,如果任務數大于空閑的線程數,則把它們放進隊列中等待
newSingleThreadPool大小為1的線程池,任務一個接著一個完成
newScheduledThreadPool 定長線程池,可控制線程最大并發數,支持定時及周期性任務執行,用來代替Timer
基本方法在上文http://segmentfault.com/a/1190000003091174 中說到了callable不能直接被Thread運行,但卻能被線程池運行,ExecutorService提供了幾種方法運行一個任務:
Future submit(Callable task);
Future submit(Runnable task, T result);
Future submit(Runnable task);
第一個方法可以直接提交一個Callable任務,返回一個包含結果的Future
此外,有兩個常用的關閉線程池的方法:
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(Future result : results){ process(result.get()); } ...
這樣處理的一個弊端是,如果第一個任務花費了很長時間,則不得不等待。在某些情況下,可能只需要一個任務出了結果就可以中止所有任務,這樣就得不償失。將結果按照可獲得的順序保存起來可能更好,這時需要用到ExecutorCompletionService來進行排列:
ExecutorCompletionService service = new ExecutorCompletionService(executor); for(Callabletask:tasks){ service.submit(task); } for(int i = 0;i < task.size();i++){ process(service.take().get()); } ...
其中,take()方法會移除下一個已經完成的結果(Future),如果沒有可用結果則阻塞
使用小結在使用線程池時,大多應該按照以下步驟:
調用Executors類中的靜態方法newCachedThreadPool或newFixedThreadPool創建線程池;
調用submit提交Runnable或Callable任務;
如果想取消一個任務,或者提交了Callable對象,那就要保存好返回的Future對象;
當不再提交任務時,調用shutdown
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64436.html
摘要:類則扮演線程池工廠角色,通過可以取得一個具有特定功能的線程池。返回一個可根據實際情況調整線程數量的線程池,線程數量不確定,若有空閑,則會有限復用線程。所有線程在當前任務執行完后,將返回線程池待復用。 前言 多線程的軟件設計方案確實可以最大限度地發揮現代多核處理器的計算能力,提高生產系列的吞吐量和性能。但是,若不加控制和管理的隨意使用線程,對系統的性能反而會產生不利的影響。最容易想到的后...
摘要:本文只介紹中線程池的基本使用,不會過多的涉及到線程池的原理。可緩存線程的線程池創建一個可緩存線程的線程池。首先是從接口繼承到的方法使用該方法即將一個任務交給線程池去執行。方法方法的作用是向線程池發送關閉的指令。 首先,我們為什么需要線程池?讓我們先來了解下什么是 對象池 技術。某些對象(比如線程,數據庫連接等),它們創建的代價是非常大的 —— 相比于一般對象,它們創建消耗的時間和內存都...
摘要:最后,我們會通過對源代碼的剖析深入了解線程池的運行過程和具體設計,真正達到知其然而知其所以然的水平。創建線程池既然線程池是一個類,那么最直接的使用方法一定是一個類的對象,例如。單線程線程池單線程線程 我們一般不會選擇直接使用線程類Thread進行多線程編程,而是使用更方便的線程池來進行任務的調度和管理。線程池就像共享單車,我們只要在我們有需要的時候去獲取就可以了。甚至可以說線程池更棒,...
摘要:如果是這樣,你一定要拿出個小時的時間,參加一次馬士兵老師的多線程與高并發訓練營。橫掃一切關于多線程的問題,吊打所有敢于提問并發問題的面試官。 如果你平時只有CRUD的經驗,從來不會了解多線程與高并發,相信你一定一頭霧水。如果是這樣,你一定要拿出4個小時的時間,參加一次馬士兵老師的《多線程與高并發》訓練營。讓骨灰級掃地神僧馬...
閱讀 2022·2019-08-30 15:52
閱讀 2982·2019-08-29 16:09
閱讀 1328·2019-08-28 18:30
閱讀 2457·2019-08-26 12:24
閱讀 1099·2019-08-26 12:12
閱讀 2278·2019-08-26 10:45
閱讀 572·2019-08-23 17:52
閱讀 827·2019-08-23 16:03