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