Java多線程中的ThreadPoolExecutor使用解析
ThreadPoolExecutor繼承關(guān)系結(jié)構(gòu)


ThreadPoolExecutor初始化構(gòu)造方法

public ThreadPoolExecutor(int corePoolSize, #核心線程池大小,包括空閑線程。
int maximumPoolSize, #線程池最大線程數(shù)
long keepAliveTime, #超過(guò)corePoolSize的空閑線程保持存活的時(shí)長(zhǎng)
TimeUnit unit, #keepAliveTime時(shí)長(zhǎng)單位
BlockingQueue<Runnable> workQueue #存放待處理線程的Queue
ThreadFactory threadFactory, #線程工廠對(duì)象,定制化線程池的線程屬性(name,uncaughtException(),daemon,priority)
RejectedExecutionHandler handler) #異常拒絕處理器,處理任務(wù)被拒絕執(zhí)行時(shí)的行為;默認(rèn)new AbortPolicy()ThreadPoolExecutor方法
int getCorePoolSize() #返回核心線程數(shù)量 int getMaximumPoolSize() #返回最大的線程數(shù)量 int getPoolSize() #返回當(dāng)前線程池中的線程數(shù)量,包括在運(yùn)行或休眠,new ThreadPoolExecutor()不會(huì)立馬創(chuàng)建可用線程 int getQueue().size() #返回等待執(zhí)行線程的隊(duì)列數(shù)量 void shutdown() #不再添加新task,使當(dāng)前未執(zhí)行完的線程繼續(xù)執(zhí)行,不會(huì)阻塞主線程main,調(diào)用shutdown()后,主線程馬上結(jié)束,而線程池繼續(xù)執(zhí)行直到任務(wù)執(zhí)行完畢;shutdown()使線程池狀態(tài)立即變成SHUTDOWN狀態(tài) List<Runnable> shutdownNow() #中斷所有Task并且拋出InterruptesException異常,前提是線程中使用Thread.currentThread().isInterrupted()判斷當(dāng)前線程是否被中斷;shutdownNow()使線程池狀態(tài)立即變成STOP狀態(tài),并試圖停止所有正在執(zhí)行的線程,線程池繼續(xù)執(zhí)行直到當(dāng)前任務(wù)執(zhí)行完畢 boolean isShutdown() #當(dāng)前線程池是否已被關(guān)閉 boolean isTerminating() #判斷當(dāng)前線程池在shutdown()或shutdownNow()后處于正在中止但是尚未完全中止時(shí),返回ture。 boolean isTerminated() #判斷當(dāng)前線程池在shutdown()或shutdownNow()后已完全中止時(shí),返回ture。 boolean awaitTermination(long timeout, TimeUnit unit) #在指定時(shí)間內(nèi)查看線程池是否已終止工作;在線程池執(zhí)行shutdown()后,如果池中還有任務(wù)在被執(zhí)行則阻塞,否則將不再阻塞;與shutdown()結(jié)合可實(shí)現(xiàn)"等待執(zhí)行完畢"的效果。 boolean allowsCoreThreadTimeOut() #配置核心線程是否有超時(shí)效果 boolean allowsCoreThreadTimeOut(boolean value) #配置核心線程是否有超時(shí)效果 boolean prestartCoreThread() #每次初始化一個(gè)核心線程,直到達(dá)到corePoolSize時(shí)返回false int prestartAllCoreThreads() #初始化全部corePoolSize數(shù)量的核心線程,返回初始化的個(gè)數(shù) long getCompletedTaskCount() #返回已執(zhí)行完成的線程大概累積數(shù)量 void beforeExecute(Thread t, Runnable r) #線程執(zhí)行前的操作 void afterExecute(Runnable r, Throwable t) #線程執(zhí)行結(jié)束后的操作 boolean remove(Runnable task) #刪除被execute()調(diào)用的尚未被執(zhí)行的Runnable任務(wù),對(duì)submit()調(diào)用的線程需使用purge() int getActiveCount() #獲取正在執(zhí)行任務(wù)的線程數(shù) long getTaskCount() #獲取可被執(zhí)行的任務(wù)數(shù)
常見(jiàn)3種隊(duì)列
作用:作為線程池的緩沖,當(dāng)新增線程超過(guò)maximumPoolSize時(shí),會(huì)將新增線程暫時(shí)存放到該隊(duì)列中;
LinkedBlockingDeque:無(wú)邊界雙端隊(duì)列;
1>默認(rèn)構(gòu)造器由于該隊(duì)列大小沒(méi)有限制,執(zhí)行execute不會(huì)拋出異常,但是線程池同時(shí)運(yùn)行線程數(shù)不會(huì)超過(guò)corePoolSize;此時(shí)maximumPoolSize和keepAliveTime無(wú)效,因?yàn)槎嘤诘木€程會(huì)被放入LinkedBlockingQueue隊(duì)列中等待;
2>指定邊界大小時(shí),maximumPoolSize+邊界大小<待執(zhí)行的任務(wù)時(shí),多于的任務(wù)將執(zhí)行拒絕策略;
ArrayBlockingQueue:有邊界隊(duì)列;maximumPoolSize+邊界大小<待執(zhí)行的任務(wù)時(shí),多余的任務(wù)將執(zhí)行拒絕策略;
SynchronousQueue:有序隊(duì)列;當(dāng)執(zhí)行的線程大于maximumPoolSize時(shí),多余線程將執(zhí)行拒絕策略。
4種拒絕策略
AbortPolicy:當(dāng)任務(wù)添加到線程池被拒絕時(shí),拋出RejectedExceutionExcetion異常,默認(rèn)策略;
CallerRunsPolicy:當(dāng)任務(wù)添加到線程池被拒絕時(shí),會(huì)調(diào)用創(chuàng)建線程池的父線程來(lái)處理被拒絕任務(wù);
DiscardOldestPolicy:當(dāng)任務(wù)添加到線程池被拒絕時(shí),線程池會(huì)丟棄等待隊(duì)列中最舊未處理任務(wù),然后將被拒絕任務(wù)添加到等待隊(duì)列中;
DiscardPolicy:當(dāng)任務(wù)添加到線程池被拒絕時(shí),線程池會(huì)丟棄被拒絕任務(wù);
到此這篇關(guān)于Java多線程中的ThreadPoolExecutor使用解析的文章就介紹到這了,更多相關(guān)Java的ThreadPoolExecutor內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中http請(qǐng)求之restTemplate配置超時(shí)時(shí)間問(wèn)題解決
這篇文章主要介紹了java中http請(qǐng)求之restTemplate配置超時(shí)時(shí)間,本文給大家分享三種解決方法,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Java設(shè)計(jì)模式之命令模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
命令模式就是對(duì)命令的封裝,下文中給大家介紹了命令模式類圖中的基本結(jié)構(gòu),對(duì)java設(shè)計(jì)模式之命令模式相關(guān)知識(shí)感興趣的朋友一起看看吧2017-08-08
JavaWeb搭建網(wǎng)上圖書(shū)商城畢業(yè)設(shè)計(jì)
這篇文章主要介紹了JavaWeb搭建網(wǎng)上圖書(shū)商城框架,特別適合正在為網(wǎng)上商城畢業(yè)設(shè)計(jì)煩惱的同學(xué),需要的朋友可以參考下2015-11-11
如何基于LoadingCache實(shí)現(xiàn)Java本地緩存
這篇文章主要介紹了如何基于LoadingCache實(shí)現(xiàn)Java本地緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
spring集成mybatis實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)讀寫(xiě)分離
本文通過(guò)實(shí)例代碼給大家介紹了spring集成mybatis實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)讀寫(xiě)分離,需要的朋友可以參考下2017-08-08
SpringBoot保護(hù)配置文件中敏感信息的保姆級(jí)教程
這篇文章主要為大家詳細(xì)介紹了SpringBoot保護(hù)配置文件中敏感信息的保姆級(jí)教程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-12-12
Java?Web開(kāi)發(fā)常用框架Spring?MVC?Struts示例解析
這篇文章主要為大家介紹了Java?Web開(kāi)發(fā)常用框架Spring?MVC?Struts示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
SpringCloud兩種注冊(cè)中心的實(shí)現(xiàn)
本文主要介紹了SpringCloud兩種注冊(cè)中心的實(shí)現(xiàn),包括服務(wù)注冊(cè)、服務(wù)拉取、負(fù)載均衡和實(shí)例權(quán)重配置等,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01

