Java多線程中的ThreadPoolExecutor使用解析
ThreadPoolExecutor繼承關(guān)系結(jié)構(gòu)
ThreadPoolExecutor初始化構(gòu)造方法
public ThreadPoolExecutor(int corePoolSize, #核心線程池大小,包括空閑線程。 int maximumPoolSize, #線程池最大線程數(shù) long keepAliveTime, #超過corePoolSize的空閑線程保持存活的時(shí)長 TimeUnit unit, #keepAliveTime時(shí)長單位 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ù)
常見3種隊(duì)列
作用:作為線程池的緩沖,當(dāng)新增線程超過maximumPoolSize時(shí),會(huì)將新增線程暫時(shí)存放到該隊(duì)列中;
LinkedBlockingDeque:無邊界雙端隊(duì)列;
1>默認(rèn)構(gòu)造器由于該隊(duì)列大小沒有限制,執(zhí)行execute不會(huì)拋出異常,但是線程池同時(shí)運(yùn)行線程數(shù)不會(huì)超過corePoolSize;此時(shí)maximumPoolSize和keepAliveTime無效,因?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)建線程池的父線程來處理被拒絕任務(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)文章
通過實(shí)例學(xué)習(xí)Either 樹和模式匹配
這篇文章主要介紹了通過實(shí)例學(xué)習(xí)Either 樹和模式匹配,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06解決@PathVariable參數(shù)接收不完整的問題
這篇文章主要介紹了解決@PathVariable參數(shù)接收不完整的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08SpringBoot中解決跨域的多種實(shí)現(xiàn)方式
這篇文章主要介紹了SpringBoot中解決跨域的多種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05spring使用WebSocket注入service層失敗問題及解決
這篇文章主要介紹了spring使用WebSocket注入service層失敗問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Java中Stream流中map和forEach的區(qū)別詳解
本文主要介紹了Java中Stream流中map和forEach的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04