理解java執行緒的中斷 interrupt

2021-08-21 11:30:15 字數 1736 閱讀 7922

**

public class thread3 extends thread  

else

} }

public static void main(string args) throws interruptedexception

}

//interrupted的經典使用**    

public void run()

}catch(interruptedexception e)

finally

}

/*  

* 如果執行緒被阻塞,它便不能核查共享變數,也就不能停止。這在許多情況下會發生,例如呼叫

* object.wait()、serversocket.accept()和datagramsocket.receive()時,他們都可能永

* 久的阻塞執行緒。即使發生超時,在超時期滿之前持續等待也是不可行和不適當的,所以,要使

* 用某種機制使得執行緒更早地退出被阻塞的狀態。很不幸運,不存在這樣一種機制對所有的情況

* 都適用,但是,根據情況不同卻可以使用特定的技術。使用thread.interrupt()中斷執行緒正

* 如example1中所描述的,thread.interrupt()方法不會中斷乙個正在執行的執行緒。這一方法

* 確切的說,如果執行緒被object.wait, thread.join和thread.sleep三種方法之一阻塞,那麼,

* 它將接收到乙個中斷異常(interruptedexception),從而提早地終結被阻塞狀態。因此,

* 如果執行緒被上述幾種方法阻塞,正確的停止執行緒方式是設定共享變數,並呼叫interrupt()(注

* 意變數應該先設定)。如果執行緒沒有被阻塞,這時呼叫interrupt()將不起作用;否則,執行緒就

* 將得到異常(該執行緒必須事先預備好處理此狀況),接著逃離阻塞狀態。在任何一種情況中,最

* 後執行緒都將檢查共享變數然後再停止。下面示例描述了該技術。

* */

package concurrency.interrupt;

class example3 extends thread

public void run() catch (interruptedexception e)

} system.out.println("thread exiting under request...");

} }

/* * 把握幾個重點:stop變數、run方法中的sleep()、interrupt()、interruptedexception。串接起

* 來就是這個意思:當我們在run方法中呼叫sleep(或其他阻塞執行緒的方法)時,如果執行緒阻塞的

* 時間過長,比如10s,那在這10s內,執行緒阻塞,run方法不被執行,但是如果在這10s內,stop被

* 不能檢查stop,所 以執行緒不能終止,這個時候,我們就可以用interrupt()方法了:我們在

* 訊號,該訊號將被catch語句捕獲到,一旦捕獲到這個訊號,執行緒就提前終結自己的阻塞狀態,這

* 樣,它就能夠 再次執行run 方法了,然後檢查到stop = true,while迴圈就不會再被執行,在執

* 行了while後面的清理工作之後,run方法執行完 畢,執行緒終止。

* */

正確中斷java執行緒

不提倡的stop 方法 臭名昭著的stop 停止執行緒的方法已不提倡使用了,原因是什麼呢?當在乙個執行緒物件上呼叫stop 方法時,這個執行緒物件所執行的執行緒就會立即停止,並丟擲特殊的threaddeath 異常。這裡的 立即 因為太 立即 了,假如乙個執行緒正在執行 synchronized v...

正確中斷java執行緒

不提倡的stop 方法 臭名昭著的stop 停止執行緒的方法已不提倡使用了,原因是什麼呢?當在乙個執行緒物件上呼叫stop 方法時,這個執行緒物件所執行的執行緒就會立即停止,並丟擲特殊的threaddeath 異常。這裡的 立即 因為太 立即 了,假如乙個執行緒正在執行 synchronized v...

對執行緒中斷,join,yield的理解

乙個執行緒在未正常結束之前,被強制終止是很危險的事情.因為它可能帶來完全預料不到的嚴重後果.所以你看到thread.suspend,thread.stop等方法都被deprecated了 那麼不能直接把乙個執行緒搞掛掉,但有時候又有必要讓乙個執行緒死掉,或者讓它結束某種等待的狀態 該怎麼辦呢?優雅的...