溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java的線程池飽、拒絕策略與異常處理機制案例分析

發(fā)布時間:2021-11-16 11:21:02 來源:億速云 閱讀:242 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“Java的線程池飽、拒絕策略與異常處理機制案例分析”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java的線程池飽、拒絕策略與異常處理機制案例分析”吧!

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

線程飽和策略

1. 什么時候會飽和?

當核心線程corePoolSize滿且阻塞隊列也滿時才會判斷當前線程數(shù)是否小于最大線程數(shù),并決定是否創(chuàng)建新線程,如果創(chuàng)建的線程總數(shù)大于maximumPoolSize的時候,就會觸發(fā)RejectedExecetionHandler。

2.飽和策略有哪些?

JDK主要提供了4種飽和策略供選擇。4種策略都做為靜態(tài)內(nèi)部類在ThreadPoolExcutor中進行實現(xiàn)。

AbortPolicy中止策略、DiscardPolicy拋棄策略、DiscardOldestPolicy拋棄舊任務(wù)策略、CallerRunsPolicy調(diào)用者運行

ThreadPoolExecutor.AbortPolicy:丟棄任務(wù)并拋出RejectedExecutionException異常。 
ThreadPoolExecutor.DiscardPolicy:也是丟棄任務(wù),但是不拋出異常。 
ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務(wù),然后重新嘗試執(zhí)行任務(wù)(重復(fù)此過程) 
ThreadPoolExecutor.CallerRunsPolicy:由調(diào)用線程處理該任務(wù)

3.JUC封裝的4種線程池

newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor

線程異常處理

先說結(jié)論:

1. runnable里面的 run 函數(shù)里面的邏輯必須 try...catch 

//如果用的是submit,如果這里不加try catch 會導(dǎo)致異常被”吃掉“ 
PULL_TASK_EXECUTOR.execute(new Runnable() {

            @Override public void run() {
                try{
                    
                }catch (Exception e){
                    
                }
            }
        });

意思就是說二者最大的區(qū)別就是異常處理上,在execute的時候,如果你沒有實現(xiàn)一個handler,那么他就使用默認的handler來處理異常,你要是實現(xiàn)了一個handler

他就會使用的實例化的handler,但是對于submit來說,異常是綁定到Future上了,但是調(diào)用future.get()的時候,這些異常才會給你拋出來,意味著你自己定義的handler

其實是無效的

public static void main(String[] args) {
        System.out.println("start");
        try{
             Executors.ASYNC_SERVICE_EXECUTOR.submit(() -> {
                System.out.println("task start...");
                Object obj = null;
                String str = obj.toString();
                System.out.println("str=");
            });
            System.out.println("end");
        }catch(Exception e){
            log.error(e.getMessage());
        }

    }

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

感謝各位的閱讀,以上就是“Java的線程池飽、拒絕策略與異常處理機制案例分析”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Java的線程池飽、拒絕策略與異常處理機制案例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI