interrupt方法
在JDK1.0中,可以用stop方法來終止,但是現在這種方法已經被禁用了,改用interrupt方法。
Thread.interrupt()方法不會中斷一個正在運作的線程。它的作用是,線上程受到阻塞時抛出一個中斷信号,這樣線程就得以退出阻塞的狀态。更确切的說,如果線程被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,那麼,它将接收到一個中斷異常(InterruptedException),進而提早地終結被阻塞狀态。
interrupt方法并不是強制終止線程,它隻能設定線程的interrupted狀态,而線上程中一般使用一下方式:
while (!Thread.currentThread().isInterrupted() && more work to do) {...}
而被block的線程(sleep() or join())在被調用interrupt時會産生InterruptException,此時是否終止線程由本線程自己決定。
Thread.interrupted 線程複位
外面的線程調用 thread.interrupt 來設定中斷辨別,而線上程裡面,又通過 Thread.interrupted 把線程的辨別又進行了複位
還 有 一 種 被 動 複 位 的 場 景 , 就 是 對 抛 出InterruptedException 異 常 的 方 法 , 在
InterruptedException 抛出之前,JVM 會先把線程的中斷辨別位清除,然後才會抛出 InterruptedException,這個時候如果調用 isInterrupted 方法,将會傳回 false
為什麼要複位?
Thread.interrupted()是屬于目前線程的,是目前線程對外界中斷信号的一個響應,表示自己已經得到了中斷信号,但不會立刻中斷自己,具體什麼時候中斷由自己決定,讓外界知道在自身中斷前,他的中斷狀态仍然是 false,這就是複位的原因。