09之 interrupt 和執行緒終止方式

2021-10-07 08:12:51 字數 3814 閱讀 5775

interrupt()是給執行緒設定中斷標誌;interrupted()是檢測中斷並清除中斷狀態;isinterrupted()只檢測中斷。還有重要的一點就是interrupted()作用於當前執行緒,interrupt()和isinterrupted()作用於此執行緒,即**中呼叫此方法的例項所代表的執行緒。

首先看看官方說明:

interrupt()方法

其作用是中斷此執行緒(此執行緒不一定是當前執行緒,而是指呼叫該方法的thread例項所代表的執行緒),但實際上只是給執行緒設定乙個中斷標誌,執行緒仍會繼續執行。

interrupted()方法

作用是測試當前執行緒是否被中斷(檢查中斷標誌),返回乙個boolean並清除中斷狀態,第二次再呼叫時中斷狀態已經被清除,將返回乙個false。

isinterrupted()方法

作用是只測試此執行緒是否被中斷 ,不清除中斷狀態。

下面我們進行測試說明:

定義乙個mythread類,繼承thread,如下:

public class mythread extends thread {

@override

public  void run() {

for (int i = 0; i < 10; i++) {

system.out.println("i="+(i+1));

在main方法中測試:

public class do {

public static void main(string args ) {

mythread thread=new mythread();

thread.start();

thread.interrupt();

system.out.println("第一次呼叫thread.isinterrupted():"+thread.isinterrupted());

system.out.println("第二次呼叫thread.isinterrupted():"+thread.isinterrupted());

system.out.println("thread是否存活:"+thread.isalive());

輸出如下:

從結果可以看出呼叫interrupt()方法後,執行緒仍在繼續執行,並未停止,但已經給執行緒設定了中斷標誌,兩個isinterrupted()方法都會輸出true,也說明isinterrupted()方法並不會清除中斷狀態。

下面我們把**修改一下,多加兩行呼叫interrupted()方法:

public class do {

public static void main(string args ) {

mythread thread=new mythread();

thread.start();

thread.interrupt();

system.out.println("第一次呼叫thread.isinterrupted():"+thread.isinterrupted());

system.out.println("第二次呼叫thread.isinterrupted():"+thread.isinterrupted());

//測試interrupted()函式

system.out.println("第一次呼叫thread.interrupted():"+thread.interrupted());

system.out.println("第二次呼叫thread.interrupted():"+thread.interrupted());

system.out.println("thread是否存活:"+thread.isalive());

輸出如下:

從輸出結果看,可能會有疑惑,為什麼後面兩個interrupted方法輸出的都是false,而不是預料中的乙個true乙個false?注意!!!這是乙個坑!!!上面說到,interrupted()方法測試的是當前執行緒是否被中斷,當前執行緒!!!當前執行緒!!!這裡當前執行緒是main執行緒,而thread.interrupt()中斷的是thread執行緒,這裡的此執行緒就是thread執行緒。所以當前執行緒main從未被中斷過,儘管interrupted()方法是以thread.interrupted()的形式被呼叫,但它檢測的仍然是main執行緒而不是檢測thread執行緒,所以thread.interrupted()在這裡相當於main.interrupted()。對於這點,下面我們再修改進行測試。

thread.currentthread()函式可以獲取當前執行緒,下面**中獲取的是main執行緒

public class do {

public static void main(string args ) throws interruptedexception {

thread.currentthread().interrupt();

system.out.println("第一次呼叫thread.currentthread().interrupt():"

+thread.currentthread().isinterrupted());

system.out.println("第一次呼叫thread.interrupted():"

+thread.currentthread().interrupted());

system.out.println("第二次呼叫thread.interrupted():"

+thread.currentthread().interrupted());

這裡都是針對當前執行緒在操作,如果interrupted()方法有檢測中斷並清除中斷狀態的作用,預料中的輸出應該是true-true-false,實際輸出如下:

結果證明猜想是正確的。

修改mythread類:

public class mythread extends thread {

@override

public  void run() {

for (int i = 0; i < 1000; i++) {

system.out.println("i="+(i+1));

if(this.isinterrupted()){

system.out.println("通過this.isinterrupted()檢測到中斷");

system.out.println("第乙個interrupted()"+this.interrupted());

system.out.println("第二個interrupted()"+this.interrupted());

break;

system.out.println("因為檢測到中斷,所以跳出迴圈,執行緒到這裡結束,因為後面沒有內容了");

測試mythread:

public class do {

public static void main(string args ) throws interruptedexception {

mythread mythread=new mythread();

mythread.start();

mythread.interrupt();

//sleep等待一秒,等mythread執行完

thread.currentthread().sleep(1000);

system.out.println("mythread執行緒是否存活:"+mythread.isalive());

結果:最後總結,關於這三個方法,interrupt()是給執行緒設定中斷標誌;interrupted()是檢測中斷並清除中斷狀態;isinterrupted()只檢測中斷。還有重要的一點就是interrupted()作用於當前執行緒,interrupt()和isinterrupted()作用於此執行緒,即**中呼叫此方法的例項所代表的執行緒。

interrupt 執行緒相關

1.sleep interrupt 執行緒a正在使用sleep 暫停著 thread.sleep 100000 如果要取消他的等待狀態,可以在正在執行的執行緒裡 比如這裡是b 呼叫 a.interrupt 令執行緒a放棄睡眠操作,這裡a是執行緒a對應到的thread例項 執行interrupt 時,...

執行緒中斷interrupt

案例 這裡需要注意一下,try catch到interruptedexception e異常時,中斷訊號會被抹除,所以th.isinterrupted 如果執行在catch異常前,則isinterrupted為true,可以正常退出,否則中斷訊號抹除後,isinterrupted得到的值為false...

執行緒打斷interrupt

j a在之前是有執行緒打斷方法的,但是都已經不推薦使用了,原因如下 現在如果你希望打斷乙個執行緒,需要使用interrupt方法 第乙個interrupt方法 分析一下 執行緒打斷不保證成功,如果打斷的執行緒不是自己,那麼就需要去檢查自己是否有這個許可權去打斷乙個執行緒,檢測過程中,如果打斷者沒有許...