Java并發(fā)編程之線程中斷
線程中斷:
void interrupted()方法:中斷線程,例如,當線程A運行時,線程B可以調(diào)用線程A的interrupted()方法來設置線程的中斷標志為true并立即返回。設置標志僅僅是為了設置標志,線程A實際并沒有被中斷,它會繼續(xù)往下執(zhí)行,如果線程A因為調(diào)用了wait()方法,join()方法或者sleep()方法而引起的阻塞掛起,這時候若線程B調(diào)用線程A的interrupted()方法,線程A回調(diào)用這些方法的地方會拋出InterruptedException異常而返回。
boolean isInterrupted()方法:檢測當前線程是否被中斷,如果是返回true,否則返回false。
boolean intertupted()方法:檢測當縣線程是否被中斷,如果是返回true,否則返回false。與isInterrupted()不同的是,該方法如果發(fā)現(xiàn)線程被中斷,則會清除中斷標志。
package com.heiye.learn1;
import java.util.logging.Logger;
public class InterruptedTest {
public static void main(String[] args) throws InterruptedException {
Logger logger=Logger.getLogger(InterruptedTest.class.toString());
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
//如果當前線程被中斷則退出循環(huán)
while (!Thread.currentThread().isInterrupted()){
logger.warning(Thread.currentThread()+"Hello");
}
}
});
//啟動子線程
thread.start();
//主線程休眠1s,以便中斷當前讓子線程輸出
Thread.sleep(1000);
//中斷子線程
logger.warning("main thread interrupted thread");
thread.interrupt();
//等待子線程執(zhí)行完畢
thread.join();
logger.info("main is over");
}
}

在如上代碼中,子線程thread通過檢查當前線程中斷標志來控制是否退出循環(huán),主線程在休眠1s后調(diào)用了thread的interupted()方法設置了中斷標志,所以線程thread退出了循環(huán)。
下面看一種情況,當線程為了等待一些特定條件的到來時候,一般會使用sleep()方法,wait(),join()方法來阻塞掛起當前線程。下面看一個例子:
package com.heiye.learn1;
import java.util.logging.Logger;
public class InterruptedTest2 {
public static void main(String[] args) throws InterruptedException {
Logger logger = Logger.getLogger(InterruptedTest.class.toString());
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
logger.info("threadOne begin sleep 2000 seconds");
try {
Thread.sleep(2000000);
logger.info("threadOne awaking");
} catch (InterruptedException e) {
logger.warning("threadOne is interrupted while sleeping");
return;
//e.printStackTrace();
}
logger.warning("threadOne-leaving normally") ;
}
});
threadOne.start();
//確保子線程進入睡眠狀態(tài)
Thread.sleep(1000);
//打斷子線程睡眠,讓子線程從sleep返回
threadOne.interrupt();
//等待子線程執(zhí)行完畢
threadOne.join();
logger.info("main thread is over");
}
}

到此這篇關于Java并發(fā)編程之線程中斷的文章就介紹到這了,更多相關Java線程中斷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java數(shù)據(jù)類型之引用數(shù)據(jù)類型解讀
這篇文章主要介紹了Java數(shù)據(jù)類型之引用數(shù)據(jù)類型,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
GraalVM系列Native?Image?Basics靜態(tài)分析
這篇文章主要為大家介紹了GraalVM系列Native?Image?Basics靜態(tài)分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
詳解如何將JAVA程序制作成可以直接執(zhí)行的exe文件
這篇文章主要介紹了詳解如何將JAVA程序制作成可以直接執(zhí)行的exe文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09

