Java executors創建線程池和使用ThreadPoolExecutor


Java.util.concurrent包下

executors創建線程池

1. Executors.newFixedThreadPool()

   創建一個定長的線程池,每提交一個任務就創建一個線程,直到達到池的最大長度,這時線程池會保持長度不再變化

固定數量的核心線程

雖然線程數量是固定的,但是阻塞隊列是無界隊列。如果有很多請求積壓,阻塞隊列越來越長,容易導致OOM

(無界隊列其實是用了默認參數Integer.MAX_VALUE,一般來說,不應該允許那么多請求等待)

 

 

 

2. Executors.newCachedThreadPool()

   創建一個可緩存的線程池,如果當前線程池的長度超過了處理的需要時,它可以靈活的回收空閑的線程,當需要增加時,  它可以靈活的添加新的線程,而不會對池的長度作任何限制

無核心線程

線程數量不固,和1.一樣請求一多,容易OOM

 

3. Executors.newScheduledThreadPool()

   創建一個定長的線程池,而且支持定時的以及周期性的任務執行,類似於Timer

1.類似,支持定時和周期性任務執行

也是無界隊列

 

4. Executors.newSingleThreadExecutor()

   創建一個單線程化的executor,它只創建唯一的worker線程來執行任務

必須前一項任務執行完畢才能執行后一項。

 

(核心線程和非核心線程的區別,沒有區別,所謂核心線程是指線程不被銷毀的數值范圍,而哪些線程被銷毀是隨機的)

 

概括:高並發情況無界隊列會有OOM的風險,所以推薦做法是使用ThreadPoolExecutor(定時和周期性任務使用ScheduledThreadPoolExecutor)

 

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

 
創建一個新的 ThreadPoolExecutor與給定的初始參數和默認線程工廠和拒絕執行處理程序。  

corePoolSize 核心線程數量

maximumPoolSize 最大線程數量

keepAliveTime 線程保持時間,N個時間單位

unit 時間單位(比如秒,分)

workQueue 阻塞隊列

threadFactory 線程工廠

handler 線程池拒絕策略

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM