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 線程池拒絕策略