執行緒中斷interrupt

2021-10-01 12:08:08 字數 3493 閱讀 7801

案例:

/**

* 這裡需要注意一下,try catch到interruptedexception e異常時,中斷訊號會被抹除,

* 所以th.isinterrupted()如果執行在catch異常前,則isinterrupted為true,可以正常退出,否則中斷訊號抹除後,

* isinterrupted得到的值為false,故還是死迴圈

*/public

class

threadinterruptluban

catch

(interruptedexception e)

system.out.

println

("-----next");

system.out.

println

(th.

isinterrupted()

);}}

);th.

start()

;try

catch

(interruptedexception e)

th.interrupt()

; flag=th.

isinterrupted()

; system.out.

println

("flag : "

+flag);}

}

當當前執行緒被進入阻塞狀態,若另外的乙個執行緒呼叫被阻塞的interrupt方法,則會打斷這種阻塞,因此這種方法有時會被稱為可中斷方法,記住,打斷乙個執行緒並不等於該執行緒的生命週期結束,僅僅是打斷了當前執行緒的阻塞狀態。

一但執行緒在阻塞的情況下被打斷,都會丟擲interruptedexception的異常,這個異常就像乙個signal(訊號)一樣通知當前執行緒被打斷了。

例項:

/**

* created by yd on 2019/5/30.

*/public

class

threadinterrupt

catch

(interruptedexception e)}}

; thread.

start()

; timeunit.milliseconds.

sleep(2

);thread.

interrupt()

;}}

執行結果:

oh, i am be interrupted
isinterrupted主要判斷當前執行緒是否被中斷,該方法僅是對interrupt標識的乙個判斷,並不會影響標識發生任何改變!

案例:

public

class

threadidinterrupted}}

; thread.

start()

; timeunit.milliseconds.

sleep(2

);system.out.

printf

("thread is interrupted ? %s\n"

, thread.

isinterrupted()

);thread.

interrupt()

; system.out.

printf

("thread is interrupted ? %s\n"

, thread.

isinterrupted()

);}}

執行結果:

thread is interrupted ?

false

thread is interrupted ?

true

可中斷方法捕獲到了中斷訊號(signal)之後,也就是捕獲了interruptedexception異常後會擦除掉interrupt標識。

由於在run方法中使用了sleep這個可中斷方法,它會捕獲到中斷訊號,並且會擦除interrupt標識,因此程式的執行結果都會是false;

案例2:

public

class

threadidinterrupted2

catch

(interruptedexception e)}}

};thread.

setdaemon

(true);

thread.

start()

; timeunit.milliseconds.

sleep(2

);system.out.

printf

("thread is interrupted ? %s\n"

, thread.

isinterrupted()

);thread.

interrupt()

; timeunit.milliseconds.

sleep(2

);system.out.

printf

("thread is interrupted ? %s\n"

, thread.

isinterrupted()

);}}

執行結果:

thread is interrupted ?

false

i am be interrupted ?

false

thread is interrupted ?

false

其實這也不難理解,可中斷方法捕獲到了中斷訊號之後,為了不影響執行緒中其他方法的執行,將執行緒的interrupt標識復位是一種合理的設計。

interrupted是乙個靜態方法,雖然其也用於判斷當前執行緒是否被中斷,但是它和成員方法isinterrupted有很大區別,呼叫該方法會直接擦除掉執行緒的interrupt標識,需要注意的是,如果當前執行緒被打斷了,那麼第一次呼叫interrupted方法會返回true,並且立即擦除了interrupt標識;第二次包括以後的呼叫永遠都會返回false,除非在此期間執行緒又一次被打斷。

案例:

public

class

threadidinterrupted3

catch

(interruptedexception e)

}}

執行結果:

main is interrupted ?

false

main is isinterrupted ?

true

main is interrupted ?

true

main is interrupted ?

false

執行緒中斷時,呼叫interrupted會立即擦除了interrupt標識,所以無法進入捕獲interruptedexception異常的處理邏輯中!

中斷執行緒 interrupt

呼叫interrupt 通知執行緒應該中斷 1 如果執行緒處於阻塞狀態,則執行緒立即退出被阻塞狀態,並丟擲乙個interruptedexception異常 2 如果執行緒處於正常活動狀態,那 package com.mall.controllor.alene import sun.managemen...

雜談 執行緒中斷 Interrupt

以前有乙個錯誤的認識,以為中斷操作都會丟擲異常,後來才發現並不是這樣,所以今天就來做乙個關於中斷的總結。已被棄用的stop方法 早期,thread類中有乙個stop方法,用於強行關閉乙個執行緒。但是後來發現此操作並不安全,強行關閉可能導致一致性問題。故stop方法已被官方棄用。具體原因請看why a...

Java 多執行緒 interrupt 中斷

當乙個執行緒執行時,另乙個執行緒可以呼叫對應的thread物件的interrupt 方法來中斷它,該方法只是在目標執行緒中設定乙個標誌,表示它已經被中斷,並立即返回。這裡需要注意的是,如果只是單純的呼叫interrupt 方法,執行緒並沒有實際被中斷,會繼續往下執行。created by yangt...