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