溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解Java中ExcutorService如何優雅關閉

發布時間:2020-07-20 16:34:36 來源:億速云 閱讀:230 作者:小豬 欄目:開發技術

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

關閉時可使用如下代碼

public static void waitUntilTerminate(final ExecutorService executorService, final int timeout) {
    try {
      executorService.shutdown();
      if (!executorService.awaitTermination(timeout, TimeUnit.SECONDS)) { //超時后直接關閉
        executorService.shutdownNow();
      }
    } catch (InterruptedException e) { //awaitTermination 出現中斷異常也將觸發關閉
      executorService.shutdownNow();
    }
  }

但是實際使用中,可能會出現即使使用了shutdownNow方法,還是無法終止線程的問題,那是因為你的線程無法被中斷

shutdownNow方法簡單理解就是給在運行的線程發一個中斷信號,如果你的線程忽略這個信號,那就無法停下來

舉個例子來說明這個問題

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++) {
    }
  }
}

從上面的測試用例可以看到canNotStopThread無法被shutDownNow終止

然而stopThread可以被正常終止,因為通過Thread.currentThread().isInterrupted()在判斷線程是否收到了中斷信號

看完這篇關于詳解Java中ExcutorService如何優雅關閉的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女