您好,登錄后才能下訂單哦!
這篇文章主要講解了“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)注!
免責聲明:本站發(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)容。