一队魏、 在線程中執(zhí)行任務
無限制創(chuàng)建線程的不足
.線程生命周期的開銷非常高
.資源消耗
.穩(wěn)定性
Executor基于生產(chǎn)者-消費者模式,提交任務的操作相當于生產(chǎn)者,執(zhí)行任務的線程則相當于消費者掠手。
1. Executors 返回 ExecutorService
2. ExecutorService方法submit柳恐、execute
3. ExecutorService.submit 返回 Future
線程池伐脖,Executors方法介紹
方法名解釋
newFixedThreadPool將創(chuàng)建一個固定長度的線程池,每當提交一個任務時就創(chuàng)建一個線程乐设,知道達到線程池的最大數(shù)量讼庇,這時線程池的規(guī)模將不再變化(如果某個線程由于發(fā)生了未預期的Exception而結(jié)束,那么線程池會補充一個新的線程近尚。)
newCachedThreadPool將創(chuàng)建一個可緩存的線程池蠕啄,如果線程池的當前規(guī)模超過了處理需求時,那么將回收空閑的線程戈锻,而當需求增加時歼跟,則可以添加新的線程,線程池的規(guī)模不存在任何限制格遭。
newSingleThreadExecutor將會創(chuàng)建一個單線程的Executor哈街,它創(chuàng)建單個工作者線程來執(zhí)行任務,如果這個線程異常結(jié)束拒迅,會創(chuàng)建另一個線程來替代骚秦。newSingleThreadExecutor能確保依照任務在隊列中的順序來串行執(zhí)行(例如FIFO她倘、LIFO、優(yōu)先級)
newScheduledThreadPool創(chuàng)建了一個固定長度的線程池作箍,而且以延遲或定時的方式來執(zhí)行任務帝牡,類似于Timer。
Executor的生命周期
以上四個方法都會返回ExecutorService蒙揣,ExecutorService的生命周期有3種狀態(tài):運行靶溜、關(guān)閉和已終止。
方法名解釋
shutdown將執(zhí)行平緩的關(guān)閉過程:不再接受新的任務懒震,同時等待已經(jīng)提交的任務執(zhí)行完成—包括那些還未開始執(zhí)行的任務罩息。
shutdownNow將執(zhí)行粗暴的關(guān)閉過程:它將嘗試取消所有運行中的任務,并且不再啟動隊列中尚未開始執(zhí)行的任務个扰。
Timer類負責管理延遲任務
1. 任務拆分到多個子線程處理。
2. 攜帶結(jié)果的任務Callable與Futrue
Executor執(zhí)行任務的4個生命周期:創(chuàng)建递宅,提交娘香,開始,完成办龄。
任務的提交者和執(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);
//?等待到任務被執(zhí)行完畢返回結(jié)果
//?如果任務執(zhí)行出錯烘绽,這里會拋ExecutionException
future.get();
//等待3秒,超時后會拋TimeoutException
future.get(3,??TimeUnit.SECONDS);
Callable?task?=newCallable()?{
publicObject?call()throwsException?{
Object?result?=?…;
returnresult;
}
};
有兩種任務:
Runnable
Callable - 需要返回值的任務
Task Submitter把任務提交給Executor執(zhí)行俐填,他們之間需要一種通訊手段安接,這種手段的具體實現(xiàn),通常叫做Future英融。Future通常包括get(阻塞至任務完成)盏檐, cancel,get(timeout)(等待一段時間)
等等驶悟。Future也用于異步變同步的場景胡野。
3、4. 在異構(gòu)任務并行化中存在的局限
如果一個任務是讀取IO資源痕鳍,可以使用多個線程去同時讀取硫豆,但是效率上限可能出在IO上,即使開啟再多線程讀取總速度也不可能超出IO讀取速度上限额获。
開啟多個線程本身也會調(diào)高編程難度够庙,同時開啟多個線程也會造成資源消耗恭应。
多線程提高效率很多時候并不是增加一個線程效率提高一倍抄邀,可能提高的效率微乎其微。
5. Executor與BlockingQueue
如果想提交一組計算任務昼榛,并且希望在計算完成后獲得結(jié)果境肾,可以使用BlockingQueue保存每個任務的Future剔难。
7. 為任務設(shè)置時限
//等待3秒,超時后會拋TimeoutException
future.get(3,? TimeUnit.SECONDS);
8. ExecutorService.invokeAll()
執(zhí)行給定的任務奥喻,當所有任務完成時偶宫,返回保持任務狀態(tài)和結(jié)果的 Future 列表。返回列表的所有元素的 Future.isDone() 為 true环鲤。注意纯趋,可以正常地或通過拋出異常來終止已完成 任務。如果正在進行此操作時修改了給定的 collection冷离,則此方法的結(jié)果是不確定的吵冒。
《溫紹錦 - Java并發(fā)程序設(shè)計教程》
摘錄“任務的提交者和執(zhí)行者”西剥,“任務的提交者和執(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開發(fā)者們的一面試經(jīng)典知識痹栖。但是這些知識里面并沒有太多Java全棧、Java晉階瞭空、JAVA架構(gòu)之類的題揪阿,不是我不推薦,而是希望大家更多的從基本功做起咆畏,打好基礎(chǔ)南捂,太多復雜的內(nèi)容一會兒也說不明白。
好了同學們旧找,我能介紹的也都全部介紹完給你們了黑毅,如果下獲得更多JAVA教學資源,可以選擇來我們這里共同交流钦讳,群:240448376矿瘦,很多大神在這里切磋學習,不懂可以直接問愿卒,晚上還有大牛免費直播教學缚去。
注:加群要求
1、具有一定工作經(jīng)驗的琼开,面對目前流行的技術(shù)不知從何下手易结,需要突破技術(shù)瓶頸的可以加,有些應屆生和實習生也可以加柜候。
2搞动、在公司待久了,過得很安逸渣刷,但跳槽時面試碰壁鹦肿。需要在短時間內(nèi)進修、跳槽拿高薪的可以加辅柴。
3箩溃、如果沒有工作經(jīng)驗瞭吃,但基礎(chǔ)非常扎實,對java工作機制涣旨,常用設(shè)計思想歪架,常用java開發(fā)框架掌握熟練的,可以加霹陡。
4和蚪、覺得自己很牛B,一般需求都能搞定烹棉。但是所學的知識點沒有系統(tǒng)化惠呼,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加。
5.阿里Java高級大牛直播講解知識點峦耘,分享知識剔蹋,多年工作經(jīng)驗的梳理和總結(jié),帶著大家全面辅髓、科學地建立自己的技術(shù)體系和技術(shù)認知泣崩!
PS:現(xiàn)在主要講解的內(nèi)容是(反射原理、枚舉原理與應用洛口、注解原理矫付、常用設(shè)計模式、正規(guī)表達式高級應用第焰、JAVA操作Office原理詳解买优、JAVA圖像處理技術(shù),等多個知識點的詳解和實戰(zhàn))
6.小號或者小白之類加群一律不給過挺举,謝謝杀赢。
最后,每一位讀到這里的網(wǎng)友湘纵,感謝你們能耐心地看完脂崔。覺得對你有幫助可以給個喜歡!希望在成為一名更優(yōu)秀的Java程序員的道路上梧喷,我們可以一起學習砌左、一起進步