国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java線程池的基本使用

sf190404 / 712人閱讀

摘要:此外,有兩個常用的關閉線程池的方法第一個方法將啟動一次順序關閉,有任務在執行,則等待執行完成,但不接受新的任務第二個方法將取消所有未開始的任務并且試圖中斷正在執行的任務,返回從未開始執行的任務的列表。

四種線程池

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,第二個方法會返回指定的result對象,第三個方法返回一個Future,可以使用這樣的對象來調用isDone,cancel,isCancelled,但是在get的時候返回null。

此外,有兩個常用的關閉線程池的方法:

void shutdown();
List shutdownNow()

第一個方法將啟動一次順序關閉,有任務在執行,則等待執行完成,但不接受新的任務;
第二個方法將取消所有未開始的任務并且試圖中斷正在執行的任務,返回從未開始執行的任務的列表。無法保證能夠停止正在處理的活動執行任務,但是會盡力嘗試。例如,通過 Thread.interrupt() 來取消典型的實現,所以任何任務無法響應中斷都可能永遠無法終止。

控制一組任務

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

/**
執行給定的任務,當所有任務完成時,返回保持任務狀態和結果的 Future 列表。返回列表的所有元素的 Future.isDone() 為 true。
注意,可以正常地或通過拋出異常來終止已完成任務。
**/
 List> invokeAll(Collection> tasks)
                          throws InterruptedException
/**
執行給定的任務,如果其中一個任務的結果。一旦正常或異常返回后,則取消尚未完成的任務。
**/                          
 T invokeAny(Collection> 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(Callable task:tasks){
    service.submit(task);
}

for(int i = 0;i < task.size();i++){
    process(service.take().get());
}
...

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

使用小結

在使用線程池時,大多應該按照以下步驟:

調用Executors類中的靜態方法newCachedThreadPoolnewFixedThreadPool創建線程池;

調用submit提交RunnableCallable任務;

如果想取消一個任務,或者提交了Callable對象,那就要保存好返回的Future對象;

當不再提交任務時,調用shutdown

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64436.html

相關文章

  • Java線程筆記(三):線程

    摘要:類則扮演線程池工廠角色,通過可以取得一個具有特定功能的線程池。返回一個可根據實際情況調整線程數量的線程池,線程數量不確定,若有空閑,則會有限復用線程。所有線程在當前任務執行完后,將返回線程池待復用。 前言 多線程的軟件設計方案確實可以最大限度地發揮現代多核處理器的計算能力,提高生產系列的吞吐量和性能。但是,若不加控制和管理的隨意使用線程,對系統的性能反而會產生不利的影響。最容易想到的后...

    琛h。 評論0 收藏0
  • Java線程(2):使用線程池 ThreadPoolExecutor

    摘要:本文只介紹中線程池的基本使用,不會過多的涉及到線程池的原理。可緩存線程的線程池創建一個可緩存線程的線程池。首先是從接口繼承到的方法使用該方法即將一個任務交給線程池去執行。方法方法的作用是向線程池發送關閉的指令。 首先,我們為什么需要線程池?讓我們先來了解下什么是 對象池 技術。某些對象(比如線程,數據庫連接等),它們創建的代價是非常大的 —— 相比于一般對象,它們創建消耗的時間和內存都...

    darry 評論0 收藏0
  • Java線程池從使用到閱讀源碼(3/10)

    摘要:最后,我們會通過對源代碼的剖析深入了解線程池的運行過程和具體設計,真正達到知其然而知其所以然的水平。創建線程池既然線程池是一個類,那么最直接的使用方法一定是一個類的對象,例如。單線程線程池單線程線程 我們一般不會選擇直接使用線程類Thread進行多線程編程,而是使用更方便的線程池來進行任務的調度和管理。線程池就像共享單車,我們只要在我們有需要的時候去獲取就可以了。甚至可以說線程池更棒,...

    468122151 評論0 收藏0
  • Java中的線程

    摘要:中的線程池運用場景非常廣泛,幾乎所有的一步或者并發執行程序都可以使用。代碼中如果執行了方法,線程池會提前創建并啟動所有核心線程。線程池最大數量線程池允許創建的線程最大數量。被稱為是可重用固定線程數的線程池。 Java中的線程池運用場景非常廣泛,幾乎所有的一步或者并發執行程序都可以使用。那么線程池有什么好處呢,以及他的實現原理是怎么樣的呢? 使用線程池的好處 在開發過程中,合理的使用線程...

    tomato 評論0 收藏0
  • 馬士兵MCA架構師Java互聯網架構師

    摘要:如果是這樣,你一定要拿出個小時的時間,參加一次馬士兵老師的多線程與高并發訓練營。橫掃一切關于多線程的問題,吊打所有敢于提問并發問題的面試官。 如果你平時只有CRUD的經驗,從來不會了解多線程與高并發,相信你一定一頭霧水。如果是這樣,你一定要拿出4個小時的時間,參加一次馬士兵老師的《多線程與高并發》訓練營。讓骨灰級掃地神僧馬...

    dantezhao 評論0 收藏0

發表評論

0條評論

sf190404

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<