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