Java多線程中的Interrupt簡析
Interrupt系列
在調用如下方法進行阻塞的線程,都可以調用該線程的interrupt()方法打斷其阻塞
- Object的wait方法
- Thread的sleep方法
- Thread的join方法
- InterruptibleChannel的io操作
- Selector的wakeup方法
上述方法統(tǒng)稱為可中斷方法,實際上,能拋出InterruptedException異常的方法都是可中斷方法
interrupt()方法
//源碼
public void interrupt() {
if (this != Thread.currentThread())
checkAccess();
synchronized (blockerLock) {
Interruptible b = blocker;
if (b != null) {
interrupt0(); // Just to set the interrupt flag
b.interrupt(this);
return;
}
}
interrupt0();
}當一個線程被別的線程調用它的阻塞方法時,它會調用interrupt0()設置一個中斷標識,如果被interrupt的線程正在阻塞狀態(tài),該線程的阻塞狀態(tài)會被中斷并且中斷標識被清除,如例一
//例一
package online.hengtian.Thread;
import java.util.concurrent.TimeUnit;
public class InterruptDemo {
public static void main(String[] args){
Thread t1=new Thread(()->{
int i=0;
while(i<5){
System.out.println(i+" : 我當前的中斷狀態(tài)"+Thread.currentThread().isInterrupted());
try {
TimeUnit.SECONDS.sleep(1);
System.out.println(i+" : 我沒被中斷");
} catch (InterruptedException e) {
System.out.println("我被中斷了");
System.out.println(i+" : 此時我的中斷狀態(tài)是"+Thread.currentThread().isInterrupted());
}
i++;
}
});
t1.start();
t1.interrupt();
}
}輸出
0 : 我當前的中斷狀態(tài)true
我被中斷了
0 : 此時我的中斷狀態(tài)是false
1 : 我當前的中斷狀態(tài)false
1 : 我沒被中斷
2 : 我當前的中斷狀態(tài)false
2 : 我沒被中斷
3 : 我當前的中斷狀態(tài)false
3 : 我沒被中斷
4 : 我當前的中斷狀態(tài)false
4 : 我沒被中斷
如果被interrupt的線程并沒有進入阻塞狀態(tài),該線程在進入阻塞狀態(tài)后會立即被中斷,然后清除中斷狀態(tài),測試如下:
//當線程被interrupt之后才會進入sleep方法
package online.hengtian.Thread;
import java.util.concurrent.TimeUnit;
public class InterruptDemo {
public static void main(String[] args) throws InterruptedException {
Thread t1=new Thread(()->{
//changed beginning
while(!Thread.currentThread().isInterrupted()){
System.out.println("我當前沒被中斷");
}
//changed end
int i=0;
while(i<5){
System.out.println(i+" : 我當前的中斷狀態(tài)"+Thread.currentThread().isInterrupted());
try {
TimeUnit.SECONDS.sleep(1);
System.out.println(i+" : 我沒被中斷");
} catch (InterruptedException e) {
System.out.println("我被中斷了");
System.out.println(i+" : 此時我的中斷狀態(tài)是"+Thread.currentThread().isInterrupted());
}
i++;
}
});
t1.start();
TimeUnit.SECONDS.sleep(2);
t1.interrupt();
}
}截取部分輸出如下
我當前沒被中斷
我當前沒被中斷
我當前沒被中斷
我當前沒被中斷
我當前沒被中斷
我當前沒被中斷
我當前沒被中斷
我當前沒被中斷
0 : 我當前的中斷狀態(tài)true
我被中斷了
0 : 此時我的中斷狀態(tài)是false
1 : 我當前的中斷狀態(tài)false
1 : 我沒被中斷
2 : 我當前的中斷狀態(tài)false
2 : 我沒被中斷
3 : 我當前的中斷狀態(tài)false
3 : 我沒被中斷
4 : 我當前的中斷狀態(tài)false
4 : 我沒被中斷
當理解了interrupt方法中斷的根本原因是中斷標識之后,一切都會變的很簡單
到此這篇關于Java多線程中的Interrupt簡析的文章就介紹到這了,更多相關Java的Interrupt內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java使用Flyway實現(xiàn)數(shù)據(jù)庫版本控制的技術指南
在現(xiàn)代應用開發(fā)中,數(shù)據(jù)庫結構經(jīng)常隨著業(yè)務需求不斷演變,使用手動SQL腳本管理數(shù)據(jù)庫版本,不僅容易出現(xiàn)錯誤,還難以跟蹤和回滾,Flyway是一個強大的數(shù)據(jù)庫遷移工具,能夠幫助開發(fā)者高效管理和自動化數(shù)據(jù)庫的版本控制,本文將介紹Flyway的基本功能及其在SpringBoot項目中的實踐2025-02-02
Spring Boot自定義配置屬性源(PropertySource)
這篇文章主要介紹了Spring Boot自定義配置屬性源(PropertySource),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
Java中Runnable和Callable的區(qū)別和聯(lián)系及使用場景
Java多線程有兩個重要的接口,Runnable和Callable,分別提供一個run方法和call方法,二者是有較大差異的,本文介紹Java中Runnable和Callable的區(qū)別和聯(lián)系及使用場景,感興趣的朋友一起看看吧2025-03-03
Java java.lang.InstantiationException異常案例詳解
這篇文章主要介紹了Java java.lang.InstantiationException異常案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08
解決scala.collection.mutable.Map寫入的問題
這篇文章主要介紹了解決scala.collection.mutable.Map寫入的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

