執行緒池飽和拒絕策略&異常處理機制
阿新 • • 發佈:2019-08-04
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { ... }
執行緒飽和策略
1. 什麼時候會飽和?
當核心執行緒corePoolSize滿且阻塞佇列也滿時才會判斷當前執行緒數是否小於最大執行緒數,並決定是否建立新執行緒,如果建立的執行緒總數大於maximumPoolSize的時候,就會觸發RejectedExecetionHandler。
2.飽和策略有哪些?
JDK主要提供了4種飽和策略供選擇。4種策略都做為靜態內部類在ThreadPoolExcutor中進行實現。
AbortPolicy中止策略、DiscardPolicy拋棄策略、DiscardOldestPolicy拋棄舊任務策略、CallerRunsPolicy呼叫者執行
ThreadPoolExecutor.AbortPolicy:丟棄任務並丟擲RejectedExecutionException異常。
ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不丟擲異常。
ThreadPoolExecutor.DiscardOldestPolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)
ThreadPoolExecutor.CallerRunsPolicy:由呼叫執行緒處理該任務
3.JUC封裝的4種執行緒池
newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor
執行緒異常處理
先說結論:
1. runnable裡面的 run 函式裡面的邏輯必須 try...catch
//如果用的是submit,如果這裡不加try catch 會導致異常被”吃掉“ PULL_TASK_EXECUTOR.execute(new Runnable() { @Override public void run() { try{ }catch (Exception e){ } } });
2. 執行緒直接重寫整個方法
//如果是執行緒模式
Thread t = new Thread();
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
LOGGER.error(t + " throws exception: " + e);
}
});
//如果是執行緒池的模式:
ExecutorService threadPool = Executors.newFixedThreadPool(1, r -> {
Thread t = new Thread(r);
t.setUncaughtExceptionHandler(
(t1, e) -> LOGGER.error(t1 + " throws exception: " + e));
return t;
});