溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

詳解Java中ExcutorService如何優(yōu)雅關(guān)閉

發(fā)布時(shí)間:2020-07-20 16:34:36 來(lái)源:億速云 閱讀:175 作者:小豬 欄目:開(kāi)發(fā)技術(shù)

小編這次要給大家分享的是詳解Java中ExcutorService如何優(yōu)雅關(guān)閉,文章內(nèi)容豐富,感興趣的小伙伴可以來(lái)了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

關(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方法,還是無(wú)法終止線(xiàn)程的問(wèn)題,那是因?yàn)槟愕木€(xiàn)程無(wú)法被中斷

shutdownNow方法簡(jiǎn)單理解就是給在運(yùn)行的線(xiàn)程發(fā)一個(gè)中斷信號(hào),如果你的線(xiàn)程忽略這個(gè)信號(hào),那就無(wú)法停下來(lái)

舉個(gè)例子來(lái)說(shuō)明這個(gè)問(wèn)題

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); //等待線(xiàn)程處理中斷
    Assert.assertTrue(executorService.isTerminated());
  }

  @Test
  public void shutDownNowFailTest() {
    executorService.execute(this::canNotStopThread);
    ShutDownUtils.waitUntilTerminate(executorService, 0);

    CommonUtils.sleep(1); //等待線(xiàn)程處理中斷
    Assert.assertFalse(executorService.isTerminated());
  }

  @Test
  public void shutDownNowOKTest() {
    executorService.execute(this::stopThread);
    ShutDownUtils.waitUntilTerminate(executorService, 0);

    CommonUtils.sleep(1); //等待線(xiàn)程處理中斷
    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無(wú)法被shutDownNow終止

然而stopThread可以被正常終止,因?yàn)橥ㄟ^(guò)Thread.currentThread().isInterrupted()在判斷線(xiàn)程是否收到了中斷信號(hào)

看完這篇關(guān)于詳解Java中ExcutorService如何優(yōu)雅關(guān)閉的文章,如果覺(jué)得文章內(nèi)容寫(xiě)得不錯(cuò)的話(huà),可以把它分享出去給更多人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI