您好,登錄后才能下訂單哦!
這篇文章主要講解了“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的線程池飽、拒絕策略與異常處理機制案例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。