Java ExcutorService優(yōu)雅關(guān)閉方式解析
關(guān)閉時(shí)可使用如下代碼
public static void waitUntilTerminate(final ExecutorService executorService, final int timeout) { try { executorService.shutdown(); if (!executorService.awaitTermination(timeout, TimeUnit.SECONDS)) { //超時(shí)后直接關(guān)閉executorService.shutdownNow(); } } catch (InterruptedException e) { //awaitTermination 出現(xiàn)中斷異常也將觸發(fā)關(guān)閉 executorService.shutdownNow(); } }
但是實(shí)際使用中,可能會(huì)出現(xiàn)即使使用了shutdownNow方法,還是無法終止線程的問題,那是因?yàn)槟愕木€程無法被中斷
shutdownNow方法簡(jiǎn)單理解就是給在運(yùn)行的線程發(fā)一個(gè)中斷信號(hào),如果你的線程忽略這個(gè)信號(hào),那就無法停下來
舉個(gè)例子來說明這個(gè)問題
public class ShutDownUtilsTest { private ExecutorService executorService; @Before public void init() { executorService = Executors.newFixedThreadPool(1); } @Test public void shutDownOKTest() { ShutDownUtils.waitUntilTerminate(executorService, 1); CommonUtils.sleep(1); //等待線程處理中斷 Assert.assertTrue(executorService.isTerminated()); } @Test public void shutDownNowFailTest() { executorService.execute(this::canNotStopThread); ShutDownUtils.waitUntilTerminate(executorService, 0); CommonUtils.sleep(1); //等待線程處理中斷 Assert.assertFalse(executorService.isTerminated()); } @Test public void shutDownNowOKTest() { executorService.execute(this::stopThread); ShutDownUtils.waitUntilTerminate(executorService, 0); CommonUtils.sleep(1); //等待線程處理中斷 Assert.assertTrue(executorService.isTerminated()); } private void canNotStopThread() { for (long i = 0; i < Long.MAX_VALUE; i++) { } } private void stopThread() { for (long i = 0; i < Long.MAX_VALUE && !Thread.currentThread().isInterrupted(); i++) { } }}
從上面的測(cè)試用例可以看到canNotStopThread無法被shutDownNow終止
然而stopThread可以被正常終止,因?yàn)橥ㄟ^Thread.currentThread().isInterrupted()在判斷線程是否收到了中斷信號(hào)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. idea刪除項(xiàng)目的操作方法2. IntelliJ IDEA配置Tomcat服務(wù)器的方法3. IntelliJ IDEA恢復(fù)刪除文件的方法4. IntelliJ IDEA設(shè)置默認(rèn)瀏覽器的方法5. 使用Maven 搭建 Spring MVC 本地部署Tomcat的詳細(xì)教程6. docker鏡像完全卸載的操作步驟7. IntelliJ IDEA導(dǎo)入jar包的方法8. Docker 部署 Prometheus的安裝詳細(xì)教程9. idea導(dǎo)入maven項(xiàng)目的方法10. idea重置默認(rèn)配置的方法步驟

網(wǎng)公網(wǎng)安備