線 | 程 | 池 |
---|---|---|
送出任務 | ||
↓ | ||
執行任務 | ←否 | 核心線程池是否已滿 |
↓是 | ||
将任務放入緩存隊列 | ←否 | 等待隊列是否已滿 |
↓是 | ||
建立線程執行任務 | ←否 | 線程池是否達到最大線程 |
↓是 | ||
執行拒絕政策處理無法處理的任務 |
使用線程池三種方式
ExecutorService threadPool = new Executors.newFixedThreadPool(5)
//一池固定數量線程
ExecutorService threadPool = new Executors.newSingleThreadPool();
//一池一線線程
ExecutorService threadPool = new Executors.newCachedThreadPool();
//一池n線程
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+"處理任務");
});
七大參數
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
timeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
-
corePoolSize
線程池中的窗柱核心線程數
-
maximumPoolSize
線程池能夠容納同時執行的最大線程數,此值必須大于等于一;
-
keepAliveTime
多餘的空閑線程的存活時間。(當線程池線程數量超過corePoolSize時,空閑時間達到keepAliveTime時會被銷毀直到剩下corePoolSize個線程為止)
-
unit
keepAliveTime的機關
-
workQueue
任務隊列,被送出但尚未執行的任務
-
threadFactory
表示生成線程池中工作線程的線程工廠,用于建立線程一般用預設的即可
-
handler
拒絕政策,表示當隊列滿了并且工作線程大于等于線程池的最大線程數(maximumPoolSize)
拒絕政策
-
AbortPolicy(預設)
直接抛出RejectedExecutionException異常,阻止系統正常運作
-
CallerRunsPolicy
“調用者運作” 一種調節機制,不抛異常也不抛棄任務,而是将某任務回退給調用者。
-
DiscardOldestPolicy
抛棄隊列中等待最久的任務,将新任務加入隊列,嘗試再次送出
-
DiscardPolicy
直接丢棄任務,不予任何處理(如果允許丢棄,此方案最佳)
面試填坑
前面不是說有三種使用線程池的方式嗎。那你平時用哪個比較多?
回答:三選一 ×
回答:哪個都不用,我一般都會使用
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
timeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
自定義線程池的一些參數。
因為上述三種方法,預設阻塞隊列雖說是有界的但是,最大值是Integer.MAX不太現實。
是以我們需要手動傳入一些參數,來保證業務的正常運作。
尚矽谷Java大廠面試題全集(java面試,周陽主講)-Java面試_大廠高頻面試題_陽哥---------學習筆記