Java多線程中的ThreadPoolExecutor使用解析
ThreadPoolExecutor繼承關系結構
ThreadPoolExecutor初始化構造方法
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) #異常拒絕處理器,處理任務被拒絕執(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,調用shutdown()后,主線程馬上結束,而線程池繼續(xù)執(zhí)行直到任務執(zhí)行完畢;shutdown()使線程池狀態(tài)立即變成SHUTDOWN狀態(tài) List<Runnable> shutdownNow() #中斷所有Task并且拋出InterruptesException異常,前提是線程中使用Thread.currentThread().isInterrupted()判斷當前線程是否被中斷;shutdownNow()使線程池狀態(tài)立即變成STOP狀態(tài),并試圖停止所有正在執(zhí)行的線程,線程池繼續(xù)執(zhí)行直到當前任務執(zhí)行完畢 boolean isShutdown() #當前線程池是否已被關閉 boolean isTerminating() #判斷當前線程池在shutdown()或shutdownNow()后處于正在中止但是尚未完全中止時,返回ture。 boolean isTerminated() #判斷當前線程池在shutdown()或shutdownNow()后已完全中止時,返回ture。 boolean awaitTermination(long timeout, TimeUnit unit) #在指定時間內查看線程池是否已終止工作;在線程池執(zhí)行shutdown()后,如果池中還有任務在被執(zhí)行則阻塞,否則將不再阻塞;與shutdown()結合可實現(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í)行結束后的操作 boolean remove(Runnable task) #刪除被execute()調用的尚未被執(zhí)行的Runnable任務,對submit()調用的線程需使用purge() int getActiveCount() #獲取正在執(zhí)行任務的線程數(shù) long getTaskCount() #獲取可被執(zhí)行的任務數(shù)
常見3種隊列
作用:作為線程池的緩沖,當新增線程超過maximumPoolSize時,會將新增線程暫時存放到該隊列中;
LinkedBlockingDeque:無邊界雙端隊列;
1>默認構造器由于該隊列大小沒有限制,執(zhí)行execute不會拋出異常,但是線程池同時運行線程數(shù)不會超過corePoolSize;此時maximumPoolSize和keepAliveTime無效,因為多于的線程會被放入LinkedBlockingQueue隊列中等待;
2>指定邊界大小時,maximumPoolSize+邊界大小<待執(zhí)行的任務時,多于的任務將執(zhí)行拒絕策略;
ArrayBlockingQueue:有邊界隊列;maximumPoolSize+邊界大小<待執(zhí)行的任務時,多余的任務將執(zhí)行拒絕策略;
SynchronousQueue:有序隊列;當執(zhí)行的線程大于maximumPoolSize時,多余線程將執(zhí)行拒絕策略。
4種拒絕策略
AbortPolicy:當任務添加到線程池被拒絕時,拋出RejectedExceutionExcetion異常,默認策略;
CallerRunsPolicy:當任務添加到線程池被拒絕時,會調用創(chuàng)建線程池的父線程來處理被拒絕任務;
DiscardOldestPolicy:當任務添加到線程池被拒絕時,線程池會丟棄等待隊列中最舊未處理任務,然后將被拒絕任務添加到等待隊列中;
DiscardPolicy:當任務添加到線程池被拒絕時,線程池會丟棄被拒絕任務;
到此這篇關于Java多線程中的ThreadPoolExecutor使用解析的文章就介紹到這了,更多相關Java的ThreadPoolExecutor內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決@PathVariable參數(shù)接收不完整的問題
這篇文章主要介紹了解決@PathVariable參數(shù)接收不完整的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08spring使用WebSocket注入service層失敗問題及解決
這篇文章主要介紹了spring使用WebSocket注入service層失敗問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07Java中Stream流中map和forEach的區(qū)別詳解
本文主要介紹了Java中Stream流中map和forEach的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04