亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

發布時間:2021-11-16 11:21:02 來源:億速云 閱讀:243 作者:iii 欄目:大數據

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

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

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

他就會使用的實例化的handler,但是對于submit來說,異常是綁定到Future上了,但是調用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的線程池飽、拒絕策略與異常處理機制案例分析”的內容了,經過本文的學習后,相信大家對Java的線程池飽、拒絕策略與異常處理機制案例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

榆林市| 邯郸市| 浦县| 枝江市| 萨嘎县| 亚东县| 中宁县| 靖江市| 建宁县| 梅州市| 天柱县| 日照市| 昌邑市| 福海县| 大新县| 灌南县| 历史| 赣州市| 双江| 寿光市| 建昌县| 枣阳市| 新龙县| 区。| 卢湾区| 花莲县| 左云县| 嘉禾县| 仁怀市| 乐山市| 伊吾县| 谢通门县| 元朗区| 本溪| 兴仁县| 江油市| 泸西县| 公安县| 通化县| 河间市| 高州市|