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


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

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

