溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中ThreadPoolExecutor知識有哪些

發(fā)布時間:2021-11-19 15:59:42 來源:億速云 閱讀:113 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“java中ThreadPoolExecutor知識有哪些”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

線程池技術(shù)在并發(fā)時經(jīng)常會使用到,java中的線程池的使用是通過調(diào)用ThreadPoolExecutor來實現(xiàn)的。ThreadPoolExecutor提供了四個構(gòu)造函數(shù),最后都會歸結(jié)于下面這個構(gòu)造方法:

// 七個參數(shù)的構(gòu)造函數(shù)public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)

這些參數(shù)的意義如下:

corePoolSize:該線程池中核心線程數(shù)最大值  maximumPoolSize: 該線程池中線程總數(shù)最大值  keepAliveTime:該線程池中非核心線程閑置超時時長  unit:keepAliveTime的單位  workQueue:阻塞隊列BlockingQueue,維護著等待執(zhí)行的Runnable對象  threadFactory:創(chuàng)建線程的接口,需要實現(xiàn)他的Thread newThread(Runnable r)方法。  RejectedExecutionHandler:飽和策略,最大線程和工作隊列容量且已經(jīng)飽和時execute方法都將調(diào)用RejectedExecutionHandler 。

ThreadPoolExecutor工作流程

流程圖如下:

大致過程陳述為:

  1. 向線程池中添加任務(wù),當(dāng)任務(wù)數(shù)量少于corePoolSize時,會自動創(chuàng)建thead來處理這些任務(wù);  當(dāng)添加任務(wù)數(shù)大于corePoolSize且少于maximmPoolSize時,不在創(chuàng)建線程,而是將這些任務(wù)放到阻塞隊列中,等待被執(zhí)行;  接上面2的條件,且當(dāng)阻塞隊列滿了之后,繼續(xù)創(chuàng)建thread,從而加速處理阻塞隊列;  當(dāng)添加任務(wù)大于maximmPoolSize時,根據(jù)飽和策略決定是否容許繼續(xù)向線程池中添加任務(wù),默認的飽和策略是AbortPolicy(直接丟棄)。

線程池中使用的阻塞隊列

ArrayBlockingQueue:基于數(shù)組結(jié)構(gòu)的有界阻塞隊列,構(gòu)造函數(shù)一定要傳大小,F(xiàn)IFO(先進先出);  LinkedBlockingQueue:無界,默認大小65536(Integer.MAX_VALUE),當(dāng)大量請求任務(wù)時,容易造成內(nèi)存耗盡。  SynchronousQueue:同步隊列,是一個特殊的BlockingQueue,它沒有容量(這是因為在SynchronousQueue中,插入將等待另一個線程的刪除操作,反之亦然)。  DelayedWorkQueue:這個隊列接收到任務(wù)時,首先先入隊,只有達到了指定的延時時間,才會執(zhí)行任務(wù)

阻塞隊列常見的方法如下表所示:

add      增加一個元索      如果隊列已滿,則拋出一個IIIegaISlabEepeplian異常              remove      移除并返回隊列頭部的元素      如果隊列為空,則拋出一個NoSuchElementException異常              element      返回隊列頭部的元素      如果隊列為空,則拋出一個NoSuchElementException異常              offer      添加一個元素并返回true      如果隊列已滿,則返回false              poll      移除并返問隊列頭部的元素      如果隊列為空,則返回null              peek      返回隊列頭部的元素      如果隊列為空,則返回null              put      添加一個元素      如果隊列滿,則阻塞              take      移除并返回隊列頭部的元素      如果隊列為空,則阻塞

常見四種線程池

newCachedThreadPool  newFixedThreadPool  newSingleThreadExecutor  newScheduledThreadPool

CachedThreadPool      SynchronousQueue(隊列長度無限      可增加,最大值Integer.MAX_VALUE      默認60秒超時              FixedThreadPool      LinkedBlockingQueue(隊列長度無限)      可指定nThreads,固定數(shù)量      不會超時              newSingleThreadExecutor      LinkedBlockingQueue(隊列長度無限),      固定為1      不超時              newScheduledThreadPool      DelayedWorkQueue      可增加,最大值Integer.MAX_VALUE      不超時

它們通過Executors以靜態(tài)方法的方式直接調(diào)用,實質(zhì)上是它們最終調(diào)用的是ThreadPoolExecutor的構(gòu)造方法,也就是本文最前面那段代碼。

注:KeepAliveTime=0的話,表示不等待

《阿里巴巴java開發(fā)手冊》中建議線程池不使用 Executors 去創(chuàng)建,而是通過 ThreadPoolExecutor的方式,這樣的處理方式讓寫的人員更加明確線程池的運行規(guī)則,規(guī)避資源耗盡的風(fēng)險。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

本文標題: java中ThreadPoolExecutor常識匯總

方法名說明注意
線程池使用的阻塞隊列線程池大小超時

“java中ThreadPoolExecutor知識有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI