一個線程執行完畢之后會自動結束,如果在運行過程中發生異常也會提前結束。
InterruptedException
通過調用一個線程的 interrupt() 來中斷該線程,如果該線程處于阻塞、限期等待或者無限期等待狀態,那么就會拋出 InterruptedException,從而提前結束該線程。但是不能中斷 I/O 阻塞和 synchronized 鎖阻塞。
對于以下代碼,在 main() 中啟動一個線程之后再中斷它,由于線程中調用了 Thread.sleep() 方法,因此會拋出一個 InterruptedException,從而提前結束線程,不執行之后的語句。
interrupted()
如果一個線程的 run() 方法執行一個無限循環,并且沒有執行 sleep() 等會拋出 InterruptedException 的操作,那么調用線程的 interrupt() 方法就無法使線程提前結束。
但是調用 interrupt() 方法會設置線程的中斷標記,此時調用 interrupted() 方法會返回 true。因此可以在循環體中使用 interrupted() 方法來判斷線程是否處于中斷狀態,從而提前結束線程。
Executor 的中斷操作
調用 Executor 的 shutdown() 方法會等待線程都執行完畢之后再關閉,但是如果調用的是 shutdownNow() 方法,則相當于調用每個線程的 interrupt() 方法。