亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

java線程池的基本使用

sf190404 / 768人閱讀

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

四種線程池

Executors中提供了四種線程池:

newCachedThreadPool 可緩存線程池,對(duì)于每個(gè)線程,如果有空閑線程可用,立即讓它執(zhí)行,如果沒有,則創(chuàng)建一個(gè)新線程

newFixedThreadPool 具有固定大小的線程池,如果任務(wù)數(shù)大于空閑的線程數(shù),則把它們放進(jìn)隊(duì)列中等待

newSingleThreadPool大小為1的線程池,任務(wù)一個(gè)接著一個(gè)完成

newScheduledThreadPool 定長線程池,可控制線程最大并發(fā)數(shù),支持定時(shí)及周期性任務(wù)執(zhí)行,用來代替Timer

基本方法

在上文http://segmentfault.com/a/1190000003091174 中說到了callable不能直接被Thread運(yùn)行,但卻能被線程池運(yùn)行,ExecutorService提供了幾種方法運(yùn)行一個(gè)任務(wù):

Future submit(Callable task);
Future submit(Runnable task, T result);
Future submit(Runnable task);

第一個(gè)方法可以直接提交一個(gè)Callable任務(wù),返回一個(gè)包含結(jié)果的Future,第二個(gè)方法會(huì)返回指定的result對(duì)象,第三個(gè)方法返回一個(gè)Future,可以使用這樣的對(duì)象來調(diào)用isDone,cancel,isCancelled,但是在get的時(shí)候返回null。

此外,有兩個(gè)常用的關(guān)閉線程池的方法:

void shutdown();
List shutdownNow()

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

控制一組任務(wù)

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

/**
執(zhí)行給定的任務(wù),當(dāng)所有任務(wù)完成時(shí),返回保持任務(wù)狀態(tài)和結(jié)果的 Future 列表。返回列表的所有元素的 Future.isDone() 為 true。
注意,可以正常地或通過拋出異常來終止已完成任務(wù)。
**/
 List> invokeAll(Collection> tasks)
                          throws InterruptedException
/**
執(zhí)行給定的任務(wù),如果其中一個(gè)任務(wù)的結(jié)果。一旦正常或異常返回后,則取消尚未完成的任務(wù)。
**/                          
 T invokeAny(Collection> tasks)
            throws InterruptedException,
                   ExecutionException                          

invokeAny方法提交所有任務(wù)到一個(gè)Callable對(duì)象的集合中,并且返回某個(gè)已經(jīng)完成了的任務(wù)的結(jié)果,返回的任務(wù)是不確定的。invokeAll方法則返回所有任務(wù)的結(jié)果,可以這樣來對(duì)結(jié)果進(jìn)行處理:

List> tasks=...
List> results = executor.invokeAll(tasks);
for(Future result : results){
    process(result.get());
}
...

這樣處理的一個(gè)弊端是,如果第一個(gè)任務(wù)花費(fèi)了很長時(shí)間,則不得不等待。在某些情況下,可能只需要一個(gè)任務(wù)出了結(jié)果就可以中止所有任務(wù),這樣就得不償失。將結(jié)果按照可獲得的順序保存起來可能更好,這時(shí)需要用到ExecutorCompletionService來進(jìn)行排列:

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()方法會(huì)移除下一個(gè)已經(jīng)完成的結(jié)果(Future),如果沒有可用結(jié)果則阻塞

使用小結(jié)

在使用線程池時(shí),大多應(yīng)該按照以下步驟:

調(diào)用Executors類中的靜態(tài)方法newCachedThreadPoolnewFixedThreadPool創(chuàng)建線程池;

調(diào)用submit提交RunnableCallable任務(wù);

如果想取消一個(gè)任務(wù),或者提交了Callable對(duì)象,那就要保存好返回的Future對(duì)象;

當(dāng)不再提交任務(wù)時(shí),調(diào)用shutdown

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64436.html

相關(guān)文章

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

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

    ?。?。 評(píng)論0 收藏0
  • Java線程(2):使用線程池 ThreadPoolExecutor

    摘要:本文只介紹中線程池的基本使用,不會(huì)過多的涉及到線程池的原理。可緩存線程的線程池創(chuàng)建一個(gè)可緩存線程的線程池。首先是從接口繼承到的方法使用該方法即將一個(gè)任務(wù)交給線程池去執(zhí)行。方法方法的作用是向線程池發(fā)送關(guān)閉的指令。 首先,我們?yōu)槭裁葱枰€程池?讓我們先來了解下什么是 對(duì)象池 技術(shù)。某些對(duì)象(比如線程,數(shù)據(jù)庫連接等),它們創(chuàng)建的代價(jià)是非常大的 —— 相比于一般對(duì)象,它們創(chuàng)建消耗的時(shí)間和內(nèi)存都...

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

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

    468122151 評(píng)論0 收藏0
  • Java中的線程

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

    tomato 評(píng)論0 收藏0
  • 馬士兵MCA架構(gòu)師Java互聯(lián)網(wǎng)架構(gòu)師

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

    dantezhao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

sf190404

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<