Executor框架同java.util.concurrent.Executor 接口在Java 5中被引入。Executor框架是一個(gè)根據(jù)一組執(zhí)行策略調(diào)用,調(diào)度,執(zhí)行和控制的異步任務(wù)的框架。
無(wú)限制的創(chuàng)建線(xiàn)程會(huì)引起應(yīng)用程序內(nèi)存溢出。所以創(chuàng)建一個(gè)線(xiàn)程池是個(gè)更好的的解決方案,因?yàn)榭梢韵拗凭€(xiàn)程的數(shù)量并且可以回收再利用這些線(xiàn)程。利用Executor框架可以非常方便的創(chuàng)建一個(gè)線(xiàn)程池。
Executors類(lèi)是什么?
Executors可以用于方便的創(chuàng)建線(xiàn)程池。
Java 中的線(xiàn)程池是通過(guò) Executor 框架實(shí)現(xiàn)的,該框架中用到了 Executor,Executors,ExecutorService,ThreadPoolExecutor ,Callable 和 Future、FutureTask 這幾個(gè)類(lèi)。

常見(jiàn)線(xiàn)程池的快捷創(chuàng)建方式
要配置一個(gè)線(xiàn)程池是比較復(fù)雜的,尤其是對(duì)于線(xiàn)程池的原理不是很清楚的情況下,很有可能配置的線(xiàn)程池不是較優(yōu)的,因此在Executors類(lèi)里面提供了一些靜態(tài)工廠(chǎng),生成一些常用的線(xiàn)程池。
newSingleThreadExecutor
創(chuàng)建一個(gè)單線(xiàn)程的線(xiàn)程池。這個(gè)線(xiàn)程池只有一個(gè)線(xiàn)程在工作,也就是相當(dāng)于單線(xiàn)程串行執(zhí)行所有任務(wù)。如果這個(gè)唯一的線(xiàn)程因?yàn)楫惓=Y(jié)束,那么會(huì)有一個(gè)新的線(xiàn)程來(lái)替代它。此線(xiàn)程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行。
newFixedThreadPool
創(chuàng)建固定大小的線(xiàn)程池。每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線(xiàn)程,直到線(xiàn)程達(dá)到線(xiàn)程池的最大大小。線(xiàn)程池的大小一旦達(dá)到最大值就會(huì)保持不變,如果某個(gè)線(xiàn)程因?yàn)閳?zhí)行異常而結(jié)束,那么線(xiàn)程池會(huì)補(bǔ)充一個(gè)新線(xiàn)程。
newCachedThreadPool
創(chuàng)建一個(gè)可緩存的線(xiàn)程池。如果線(xiàn)程池的大小超過(guò)了處理任務(wù)所需要的線(xiàn)程,
那么就會(huì)回收部分空閑(60秒不執(zhí)行任務(wù))的線(xiàn)程,當(dāng)任務(wù)數(shù)增加時(shí),此線(xiàn)程池又可以智能的添加新線(xiàn)程來(lái)處理任務(wù)。此線(xiàn)程池不會(huì)對(duì)線(xiàn)程池大小做限制,線(xiàn)程池大小完全依賴(lài)于操作系統(tǒng)(或者說(shuō)JVM)能夠創(chuàng)建的最大線(xiàn)程大小。
newScheduledThreadPool
創(chuàng)建一個(gè)大小無(wú)限的線(xiàn)程池。此線(xiàn)程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。
為什么不建議使用 Executors靜態(tài)工廠(chǎng)構(gòu)建線(xiàn)程池?
阿里巴巴Java開(kāi)發(fā)手冊(cè),明確指出不允許使用Executors靜態(tài)工廠(chǎng)構(gòu)建線(xiàn)程池
原因如下:
線(xiàn)程池不允許使用Executors去創(chuàng)建,而是通過(guò)ThreadPoolExecutor的方式,這樣的處理方式讓寫(xiě)的同學(xué)更加明確線(xiàn)程池的運(yùn)行規(guī)則,規(guī)避資源耗盡的風(fēng)險(xiǎn)
說(shuō)明:Executors返回的線(xiàn)程池對(duì)象的弊端如下:
1:FixedThreadPool 和 SingleThreadPool:
允許的請(qǐng)求隊(duì)列(底層實(shí)現(xiàn)是LinkedBlockingQueue)長(zhǎng)度為Integer.MAX_VALUE,可能會(huì)堆積大量的請(qǐng)求,從而導(dǎo)致OOM
2:CachedThreadPool 和 ScheduledThreadPool
允許的創(chuàng)建線(xiàn)程數(shù)量為Integer.MAX_VALUE,可能會(huì)創(chuàng)建大量的線(xiàn)程,從而導(dǎo)致OOM。
更多關(guān)于“Java培訓(xùn)”的問(wèn)題,歡迎咨詢(xún)千鋒教育在線(xiàn)名師。千鋒已有十余年的培訓(xùn)經(jīng)驗(yàn),課程大綱更科學(xué)更專(zhuān)業(yè),有針對(duì)零基礎(chǔ)的就業(yè)班,有針對(duì)想提升技術(shù)的好程序員班,高品質(zhì)課程助力你實(shí)現(xiàn)java程序員夢(mèng)想。

京公網(wǎng)安備 11010802030320號(hào)