您好,登錄后才能下訂單哦!
線程池技術在并發時經常會使用到,java中的線程池的使用是通過調用ThreadPoolExecutor來實現的。ThreadPoolExecutor提供了四個構造函數,最后都會歸結于下面這個構造方法:
// 七個參數的構造函數 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
這些參數的意義如下:
ThreadPoolExecutor工作流程
流程圖如下:
大致過程陳述為:
線程池中使用的阻塞隊列
阻塞隊列常見的方法如下表所示:
方法名 | 說明 | 注意 |
---|---|---|
add | 增加一個元索 | 如果隊列已滿,則拋出一個IIIegaISlabEepeplian異常 |
remove | 移除并返回隊列頭部的元素 | 如果隊列為空,則拋出一個NoSuchElementException異常 |
element | 返回隊列頭部的元素 | 如果隊列為空,則拋出一個NoSuchElementException異常 |
offer | 添加一個元素并返回true | 如果隊列已滿,則返回false |
poll | 移除并返問隊列頭部的元素 | 如果隊列為空,則返回null |
peek | 返回隊列頭部的元素 | 如果隊列為空,則返回null |
put | 添加一個元素 | 如果隊列滿,則阻塞 |
take | 移除并返回隊列頭部的元素 | 如果隊列為空,則阻塞 |
常見四種線程池
線程池 | 使用的阻塞隊列 | 線程池大小 | 超時 |
---|---|---|---|
CachedThreadPool | SynchronousQueue(隊列長度無限 | 可增加,最大值Integer.MAX_VALUE | 默認60秒超時 |
FixedThreadPool | LinkedBlockingQueue(隊列長度無限) | 可指定nThreads,固定數量 | 不會超時 |
newSingleThreadExecutor | LinkedBlockingQueue(隊列長度無限), | 固定為1 | 不超時 |
newScheduledThreadPool | DelayedWorkQueue | 可增加,最大值Integer.MAX_VALUE | 不超時 |
它們通過Executors以靜態方法的方式直接調用,實質上是它們最終調用的是ThreadPoolExecutor的構造方法,也就是本文最前面那段代碼。
注:KeepAliveTime=0的話,表示不等待
《阿里巴巴java開發手冊》中建議線程池不使用 Executors 去創建,而是通過 ThreadPoolExecutor的方式,這樣的處理方式讓寫的人員更加明確線程池的運行規則,規避資源耗盡的風險。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。