一、 在線程中執(zhí)行任務(wù)
無(wú)限制創(chuàng)建線程的不足
.線程生命周期的開(kāi)銷(xiāo)非常高
.資源消耗
.穩(wěn)定性
Executor基于生產(chǎn)者-消費(fèi)者模式,提交任務(wù)的操作相當(dāng)于生產(chǎn)者,執(zhí)行任務(wù)的線程則相當(dāng)于消費(fèi)者。
1. Executors 返回 ExecutorService
2. ExecutorService方法submit、execute
3. ExecutorService.submit 返回 Future
線程池,Executors方法介紹
方法名解釋
newFixedThreadPool將創(chuàng)建一個(gè)固定長(zhǎng)度的線程池,每當(dāng)提交一個(gè)任務(wù)時(shí)就創(chuàng)建一個(gè)線程,知道達(dá)到線程池的最大數(shù)量,這時(shí)線程池的規(guī)模將不再變化(如果某個(gè)線程由于發(fā)生了未預(yù)期的Exception而結(jié)束,那么線程池會(huì)補(bǔ)充一個(gè)新的線程。)
newCachedThreadPool將創(chuàng)建一個(gè)可緩存的線程池,如果線程池的當(dāng)前規(guī)模超過(guò)了處理需求時(shí),那么將回收空閑的線程,而當(dāng)需求增加時(shí),則可以添加新的線程,線程池的規(guī)模不存在任何限制。
newSingleThreadExecutor將會(huì)創(chuàng)建一個(gè)單線程的Executor,它創(chuàng)建單個(gè)工作者線程來(lái)執(zhí)行任務(wù),如果這個(gè)線程異常結(jié)束,會(huì)創(chuàng)建另一個(gè)線程來(lái)替代。newSingleThreadExecutor能確保依照任務(wù)在隊(duì)列中的順序來(lái)串行執(zhí)行(例如FIFO、LIFO、優(yōu)先級(jí))
newScheduledThreadPool創(chuàng)建了一個(gè)固定長(zhǎng)度的線程池,而且以延遲或定時(shí)的方式來(lái)執(zhí)行任務(wù),類(lèi)似于Timer。
Executor的生命周期
以上四個(gè)方法都會(huì)返回ExecutorService,ExecutorService的生命周期有3種狀態(tài):運(yùn)行、關(guān)閉和已終止。
方法名解釋
shutdown將執(zhí)行平緩的關(guān)閉過(guò)程:不再接受新的任務(wù),同時(shí)等待已經(jīng)提交的任務(wù)執(zhí)行完成—包括那些還未開(kāi)始執(zhí)行的任務(wù)。
shutdownNow將執(zhí)行粗暴的關(guān)閉過(guò)程:它將嘗試取消所有運(yùn)行中的任務(wù),并且不再啟動(dòng)隊(duì)列中尚未開(kāi)始執(zhí)行的任務(wù)。
Timer類(lèi)負(fù)責(zé)管理延遲任務(wù)
1. 任務(wù)拆分到多個(gè)子線程處理。
2. 攜帶結(jié)果的任務(wù)Callable與Futrue
Executor執(zhí)行任務(wù)的4個(gè)生命周期:創(chuàng)建,提交,開(kāi)始,完成。
任務(wù)的提交者和執(zhí)行者之間的通訊手段
[java]view plaincopy
ExecutorService?executor?=?Executors.newSingleThreadExecutor();
Callable?task?=newCallable()?{
publicObject?call()throwsException?{
Object?result?="...";
returnresult;
}
};
Future?future?=?executor.submit(task);
future.get();//?等待至完成
Future?future?=?executor.submit(task);
//?等待到任務(wù)被執(zhí)行完畢返回結(jié)果
//?如果任務(wù)執(zhí)行出錯(cuò),這里會(huì)拋ExecutionException
future.get();
//等待3秒,超時(shí)后會(huì)拋TimeoutException
future.get(3,??TimeUnit.SECONDS);
Callable?task?=newCallable()?{
publicObject?call()throwsException?{
Object?result?=?…;
returnresult;
}
};
有兩種任務(wù):
Runnable
Callable - 需要返回值的任務(wù)
Task Submitter把任務(wù)提交給Executor執(zhí)行,他們之間需要一種通訊手段,這種手段的具體實(shí)現(xiàn),通常叫做Future。Future通常包括get(阻塞至任務(wù)完成), cancel,get(timeout)(等待一段時(shí)間)
等等。Future也用于異步變同步的場(chǎng)景。
3、4. 在異構(gòu)任務(wù)并行化中存在的局限
如果一個(gè)任務(wù)是讀取IO資源,可以使用多個(gè)線程去同時(shí)讀取,但是效率上限可能出在IO上,即使開(kāi)啟再多線程讀取總速度也不可能超出IO讀取速度上限。
開(kāi)啟多個(gè)線程本身也會(huì)調(diào)高編程難度,同時(shí)開(kāi)啟多個(gè)線程也會(huì)造成資源消耗。
多線程提高效率很多時(shí)候并不是增加一個(gè)線程效率提高一倍,可能提高的效率微乎其微。
5. Executor與BlockingQueue
如果想提交一組計(jì)算任務(wù),并且希望在計(jì)算完成后獲得結(jié)果,可以使用BlockingQueue保存每個(gè)任務(wù)的Future。
7. 為任務(wù)設(shè)置時(shí)限
//等待3秒,超時(shí)后會(huì)拋TimeoutException
future.get(3,? TimeUnit.SECONDS);
8. ExecutorService.invokeAll()
執(zhí)行給定的任務(wù),當(dāng)所有任務(wù)完成時(shí),返回保持任務(wù)狀態(tài)和結(jié)果的 Future 列表。返回列表的所有元素的 Future.isDone() 為 true。注意,可以正常地或通過(guò)拋出異常來(lái)終止已完成 任務(wù)。如果正在進(jìn)行此操作時(shí)修改了給定的 collection,則此方法的結(jié)果是不確定的。
《溫紹錦 - Java并發(fā)程序設(shè)計(jì)教程》
摘錄“任務(wù)的提交者和執(zhí)行者”,“任務(wù)的提交者和執(zhí)行者之間的通訊手段”
聊聊并發(fā)(三)——JAVA線程池的分析和使用(原理)
http://www.infoq.com/cn/articles/java-threadPool
Java(Android)線程池(使用)
http://www.trinea.cn/android/java-android-thread-pool/
Java Thread Pool Example using Executors and ThreadPoolExecutor
http://www.journaldev.com/1069/java-thread-pool-example-using-executors-and-threadpoolexecutor
工具可以查看線程數(shù)
jconsole.exe
以上就是我推薦給Java開(kāi)發(fā)者們的一面試經(jīng)典知識(shí)。但是這些知識(shí)里面并沒(méi)有太多Java全棧、Java晉階、JAVA架構(gòu)之類(lèi)的題,不是我不推薦,而是希望大家更多的從基本功做起,打好基礎(chǔ),太多復(fù)雜的內(nèi)容一會(huì)兒也說(shuō)不明白。
好了同學(xué)們,我能介紹的也都全部介紹完給你們了,如果下獲得更多JAVA教學(xué)資源,可以選擇來(lái)我們這里共同交流,群:240448376,很多大神在這里切磋學(xué)習(xí),不懂可以直接問(wèn),晚上還有大牛免費(fèi)直播教學(xué)。
注:加群要求
1、具有一定工作經(jīng)驗(yàn)的,面對(duì)目前流行的技術(shù)不知從何下手,需要突破技術(shù)瓶頸的可以加,有些應(yīng)屆生和實(shí)習(xí)生也可以加。
2、在公司待久了,過(guò)得很安逸,但跳槽時(shí)面試碰壁。需要在短時(shí)間內(nèi)進(jìn)修、跳槽拿高薪的可以加。
3、如果沒(méi)有工作經(jīng)驗(yàn),但基礎(chǔ)非常扎實(shí),對(duì)java工作機(jī)制,常用設(shè)計(jì)思想,常用java開(kāi)發(fā)框架掌握熟練的,可以加。
4、覺(jué)得自己很牛B,一般需求都能搞定。但是所學(xué)的知識(shí)點(diǎn)沒(méi)有系統(tǒng)化,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加。
5.阿里Java高級(jí)大牛直播講解知識(shí)點(diǎn),分享知識(shí),多年工作經(jīng)驗(yàn)的梳理和總結(jié),帶著大家全面、科學(xué)地建立自己的技術(shù)體系和技術(shù)認(rèn)知!
PS:現(xiàn)在主要講解的內(nèi)容是(反射原理、枚舉原理與應(yīng)用、注解原理、常用設(shè)計(jì)模式、正規(guī)表達(dá)式高級(jí)應(yīng)用、JAVA操作Office原理詳解、JAVA圖像處理技術(shù),等多個(gè)知識(shí)點(diǎn)的詳解和實(shí)戰(zhàn))
6.小號(hào)或者小白之類(lèi)加群一律不給過(guò),謝謝。
最后,每一位讀到這里的網(wǎng)友,感謝你們能耐心地看完。覺(jué)得對(duì)你有幫助可以給個(gè)喜歡!希望在成為一名更優(yōu)秀的Java程序員的道路上,我們可以一起學(xué)習(xí)、一起進(jìn)步