天天看點

ExecutorService 中 shutdown()、shutdownNow()、awaitTermination() 含義和差別

文章目錄

    • 一、方法說明
      • 1、shutdown():停止接收新任務,原來的任務繼續執行
      • 2、shutdownNow():停止接收新任務,原來的任務停止執行
      • 3、awaitTermination(long timeOut, TimeUnit unit):目前線程阻塞
    • 二、差別
      • 1、shutdown() 和 shutdownNow() 的差別
      • 2、shutdown() 和 awaitTermination() 的差別
    • 三、總結

ExecutorService

是 Java 提供的線程池,也就是說,每次我們需要使用線程的時候,可以通過

ExecutorService

建立線程。

使用

ExecutorService

類時,經常用到

shutdown()

shutdownNow()

awaitTermination()

3個方法,下面我們來說說它們的含義和三者的差別 。

一、方法說明

1、shutdown():停止接收新任務,原來的任務繼續執行

英文原意:關閉,倒閉;停工。 這裡的意思是 關閉線程池。與使用資料庫連接配接池一樣,每次使用完畢後,都要關閉線程池。

1、停止接收新的submit的任務;

2、已經送出的任務(包括正在跑的和隊列中等待的),會繼續執行完成;

3、等到第2步完成後,才真正停止;

2、shutdownNow():停止接收新任務,原來的任務停止執行

1、跟 shutdown() 一樣,先停止接收新submit的任務;

2、忽略隊列裡等待的任務;

3、嘗試将正在執行的任務interrupt中斷;

4、傳回未執行的任務清單;

說明:它試圖終止線程的方法是通過調用 Thread.interrupt() 方法來實作的,這種方法的作用有限,如果線程中沒有sleep 、wait、Condition、定時鎖等應用, interrupt() 方法是無法中斷目前的線程的。是以,shutdownNow() 并不代表線程池就一定立即就能退出,它也可能必須要等待所有正在執行的任務都執行完成了才能退出。但是大多數時候是能立即退出的。

3、awaitTermination(long timeOut, TimeUnit unit):目前線程阻塞

timeout 和 TimeUnit 兩個參數,用于設定逾時的時間及機關

目前線程阻塞,直到:

  • 等所有已送出的任務(包括正在跑的和隊列中等待的)執行完;
  • 或者 等逾時時間到了(timeout 和 TimeUnit設定的時間);
  • 或者 線程被中斷,抛出InterruptedException

然後會監測 ExecutorService 是否已經關閉,傳回true(shutdown請求後所有任務執行完畢)或false(已逾時)

二、差別

1、shutdown() 和 shutdownNow() 的差別

shutdown()

隻是關閉了送出通道,用submit()是無效的;而内部該怎麼跑還是怎麼跑,跑完再停。

shutdownNow()

能立即停止線程池,正在跑的和正在等待的任務都停下了。

2、shutdown() 和 awaitTermination() 的差別

shutdown()

後,不能再送出新的任務進去;但是

awaitTermination()

後,可以繼續送出。

awaitTermination()

是阻塞的,傳回結果是線程池是否已停止(true/false);

shutdown()

不阻塞。

三、總結

1、優雅的關閉,用 shutdown()

2、想立馬關閉,并得到未執行任務清單,用shutdownNow()

3、優雅的關閉,并允許關閉聲明後新任務能送出,用 awaitTermination()

4、關閉功能 【從強到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()

繼續閱讀