1. 程式人生 > >執行緒池飽和拒絕策略&異常處理機制

執行緒池飽和拒絕策略&異常處理機制

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;
        });