1.前言
線程中斷是指在一個線程執(zhí)行的過程中,強制終止該線程的執(zhí)行。雖說是中斷,但本質(zhì)上是讓run方法快點執(zhí)行完,而不是run方法執(zhí)行到一半,強制結(jié)束.
本文主要介紹線程中斷的兩種方法
2. 方法1: 自定義標志位
看下面這段代碼:
public class Demo6 {
private static boolean flag = false;
public static void main(String[] args) {
Thread t = new Thread(()->{
while(!flag){
System.out.println("線程執(zhí)行中!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("線程執(zhí)行完了!");
});
t.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("設(shè)置標志位,讓線程執(zhí)行結(jié)束");
flag = true;
}
}
運行結(jié)果:
看下面這張圖:
在這段代碼中,定義了一個flag
的標志位,在線程t
中以標志位作為run
方法的執(zhí)行條件,每隔1s輸出一次"線程執(zhí)行中",再先讓main
線程(主線程)休眠3s,3s后main
線程開始執(zhí)行,輸出"設(shè)置標志位,讓線程執(zhí)行結(jié)束",并修改flag
變量的值為false
,線程t
不滿足執(zhí)行條件,因此線程t
執(zhí)行完畢.
3. 方法2:使用標準庫自帶的標志位
Java提供了一種中斷線程的機制,即調(diào)用線程的interrupt()
方法。
當一個線程被中斷時,它會收到一個中斷信號,但并不意味著線程會立即停止執(zhí)行。線程可以通過檢查自己的中斷狀態(tài)來決定是否停止執(zhí)行。線程可以通過調(diào)用isInterrupted()
方法來檢查自己是否被中斷。如果線程已經(jīng)被中斷,那么該方法返回true,否則返回false。
示例:
public class Demo7 {
public static void main(String[] args) {
Thread t = new Thread(()->{
while(!Thread.currentThread().isInterrupted()){
System.out.println("線程執(zhí)行中!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("線程執(zhí)行完了!");
});
t.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("設(shè)置標志位,讓線程執(zhí)行結(jié)束");
t.interrupt();
}
}
但是這么寫,會有問題
能看到,這里拋出了一個異常.而且雖然設(shè)置標志位,但是線程并沒有結(jié)束.
注意interrupt
方法有兩種行為:
- 如果線程是正常狀態(tài),會設(shè)置標志位為true
- 如果線程是阻塞狀態(tài)(sleep),不會設(shè)置標志位,而是會觸發(fā)一個
InterruptedException
這樣的異常,這個異常會將sleep
提前喚醒.由于我這里的catch
中只是打印了日志,并沒有結(jié)束循環(huán),因此線程仍在執(zhí)行中
如果想要結(jié)束循環(huán),可以在catch
中加上break
4.總結(jié)
線程中斷機制是一種優(yōu)雅的線程停止方式,可以避免線程無限期地等待某個條件而導(dǎo)致程序出現(xiàn)死鎖或無響應(yīng)的情況。但是,線程中斷并不是強制終止線程的方法,它需要線程自己來判斷是否停止執(zhí)行。因此,在編寫線程時,需要注意在適當?shù)臅r候檢查線程的中斷狀態(tài)并做出相應(yīng)的處理。文章來源:http://www.zghlxwxcb.cn/news/detail-474637.html
感謝你的觀看!希望這篇文章能幫到你!
專欄: 《從零開始的Java學(xué)習(xí)之旅》在不斷更新中,歡迎訂閱!
“愿與君共勉,攜手共進!”文章來源地址http://www.zghlxwxcb.cn/news/detail-474637.html
到了這里,關(guān)于【Java|多線程與高并發(fā)】線程的中斷的兩種方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!