面試官:線程池中線程異常后,銷毀還是復(fù)用?
共 1719字,需瀏覽 4分鐘
·
2024-06-17 14:11
分享兩道比較有意思的線程池面試題,面試中問到至少有 80% 求職者回答不上來。
這兩個問題也是經(jīng)常被拿來考察求職者對于線程池的了解。
-
線程池中線程異常后,銷毀還是復(fù)用? -
線程池在提交任務(wù)前,可以提前創(chuàng)建線程嗎?
線程池中線程異常后,銷毀還是復(fù)用?
直接說結(jié)論,需要分兩種情況:
-
使用 execute()提交任務(wù):當(dāng)任務(wù)通過execute()提交到線程池并在執(zhí)行過程中拋出異常時,如果這個異常沒有在任務(wù)內(nèi)被捕獲,那么該異常會導(dǎo)致當(dāng)前線程終止,并且異常會被打印到控制臺或日志文件中。線程池會檢測到這種線程終止,并創(chuàng)建一個新線程來替換它,從而保持配置的線程數(shù)不變。 -
使用 submit()提交任務(wù):對于通過submit()提交的任務(wù),如果在任務(wù)執(zhí)行中發(fā)生異常,這個異常不會直接打印出來。相反,異常會被封裝在由submit()返回的Future對象中。當(dāng)調(diào)用Future.get()方法時,可以捕獲到一個ExecutionException。在這種情況下,線程不會因為異常而終止,它會繼續(xù)存在于線程池中,準(zhǔn)備執(zhí)行后續(xù)的任務(wù)。
簡單來說:使用execute()時,未捕獲異常導(dǎo)致線程終止,線程池創(chuàng)建新線程替代;使用submit()時,異常被封裝在Future中,線程繼續(xù)復(fù)用。
這種設(shè)計允許submit()提供更靈活的錯誤處理機制,因為它允許調(diào)用者決定如何處理異常,而execute()則適用于那些不需要關(guān)注執(zhí)行結(jié)果的場景。
具體的源碼分析可以參考這篇:線程池中線程異常后:銷毀還是復(fù)用?- 京東技術(shù)。
線程池在提交任務(wù)前,可以提前創(chuàng)建線程嗎?
答案是可以的!ThreadPoolExecutor 提供了兩個方法幫助我們在提交任務(wù)之前,完成核心線程的創(chuàng)建,從而實現(xiàn)線程池預(yù)熱的效果:
-
prestartCoreThread():啟動一個線程,等待任務(wù),如果已達到核心線程數(shù),這個方法返回 false,否則返回 true; -
prestartAllCoreThreads():啟動所有的核心線程,并返回啟動成功的核心線程數(shù)。
-
如何檢測和避免線程死鎖? -
從 5s 到 0.5s!看看人家的 CompletableFuture 異步任務(wù)優(yōu)化技巧,確實優(yōu)雅! -
為什么線程崩潰不會導(dǎo)致 JVM 崩潰? -
Thread、Runnable、Callable、Future ... 的關(guān)系? -
如果不允許線程池丟棄任務(wù),應(yīng)該選擇哪個拒絕策略? -
如何設(shè)計一個優(yōu)先級任務(wù)線程池? -
手寫一個輕量級動態(tài)線程池,很香?。?/a> -
8 個線程池最佳實踐和坑!使用不當(dāng)直接生產(chǎn)事故!! -
ConcurrentHashMap 為何不能插入 null?HashMap 為何可以?
點擊下方卡片進入公眾號
回復(fù) 「PDF」 即可領(lǐng)取原創(chuàng)PDF技術(shù)面試手冊
回復(fù) 「學(xué)習(xí)路線」 即可獲取最新版Java學(xué)習(xí)路線
回復(fù) 「開源」 即可獲取優(yōu)質(zhì)Java開源項目合集
免費分享無套路,有幫助點個贊就好!
評論
圖片
表情
