您好,登錄后才能下訂單哦!
本篇內容介紹了“java中ThreadPoolExecutor知識有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
線程池技術在并發時經常會使用到,java中的線程池的使用是通過調用ThreadPoolExecutor來實現的。ThreadPoolExecutor提供了四個構造函數,最后都會歸結于下面這個構造方法:
// 七個參數的構造函數public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
這些參數的意義如下:
corePoolSize:該線程池中核心線程數最大值 maximumPoolSize: 該線程池中線程總數最大值 keepAliveTime:該線程池中非核心線程閑置超時時長 unit:keepAliveTime的單位 workQueue:阻塞隊列BlockingQueue,維護著等待執行的Runnable對象 threadFactory:創建線程的接口,需要實現他的Thread newThread(Runnable r)方法。 RejectedExecutionHandler:飽和策略,最大線程和工作隊列容量且已經飽和時execute方法都將調用RejectedExecutionHandler 。
ThreadPoolExecutor工作流程
流程圖如下:
大致過程陳述為:
向線程池中添加任務,當任務數量少于corePoolSize時,會自動創建thead來處理這些任務; 當添加任務數大于corePoolSize且少于maximmPoolSize時,不在創建線程,而是將這些任務放到阻塞隊列中,等待被執行; 接上面2的條件,且當阻塞隊列滿了之后,繼續創建thread,從而加速處理阻塞隊列; 當添加任務大于maximmPoolSize時,根據飽和策略決定是否容許繼續向線程池中添加任務,默認的飽和策略是AbortPolicy(直接丟棄)。
線程池中使用的阻塞隊列
ArrayBlockingQueue:基于數組結構的有界阻塞隊列,構造函數一定要傳大小,FIFO(先進先出); LinkedBlockingQueue:無界,默認大小65536(Integer.MAX_VALUE),當大量請求任務時,容易造成內存耗盡。 SynchronousQueue:同步隊列,是一個特殊的BlockingQueue,它沒有容量(這是因為在SynchronousQueue中,插入將等待另一個線程的刪除操作,反之亦然)。 DelayedWorkQueue:這個隊列接收到任務時,首先先入隊,只有達到了指定的延時時間,才會執行任務
阻塞隊列常見的方法如下表所示:
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,固定數量 不會超時 newSingleThreadExecutor LinkedBlockingQueue(隊列長度無限), 固定為1 不超時 newScheduledThreadPool DelayedWorkQueue 可增加,最大值Integer.MAX_VALUE 不超時
它們通過Executors以靜態方法的方式直接調用,實質上是它們最終調用的是ThreadPoolExecutor的構造方法,也就是本文最前面那段代碼。
注:KeepAliveTime=0的話,表示不等待
《阿里巴巴java開發手冊》中建議線程池不使用 Executors 去創建,而是通過 ThreadPoolExecutor的方式,這樣的處理方式讓寫的人員更加明確線程池的運行規則,規避資源耗盡的風險。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
本文標題: java中ThreadPoolExecutor常識匯總
方法名 | 說明 | 注意 | |
---|---|---|---|
線程池 | 使用的阻塞隊列 | 線程池大小 | 超時 |
“java中ThreadPoolExecutor知識有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。