Java并發(fā)編程之線程中斷
線程中斷:
void interrupted()方法:中斷線程,例如,當(dāng)線程A運(yùn)行時(shí),線程B可以調(diào)用線程A的interrupted()
方法來(lái)設(shè)置線程的中斷標(biāo)志為true并立即返回。設(shè)置標(biāo)志僅僅是為了設(shè)置標(biāo)志,線程A實(shí)際并沒(méi)有被中斷,它會(huì)繼續(xù)往下執(zhí)行,如果線程A因?yàn)檎{(diào)用了wait()方法,join()
方法或者sleep()
方法而引起的阻塞掛起,這時(shí)候若線程B調(diào)用線程A的interrupted()
方法,線程A回調(diào)用這些方法的地方會(huì)拋出InterruptedException
異常而返回。
boolean isInterrupted()方法:檢測(cè)當(dāng)前線程是否被中斷,如果是返回true
,否則返回false
。
boolean intertupted()方法:檢測(cè)當(dāng)縣線程是否被中斷,如果是返回true,否則返回false。與isInterrupted()
不同的是,該方法如果發(fā)現(xiàn)線程被中斷,則會(huì)清除中斷標(biāo)志。
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() { //如果當(dāng)前線程被中斷則退出循環(huán) while (!Thread.currentThread().isInterrupted()){ logger.warning(Thread.currentThread()+"Hello"); } } }); //啟動(dòng)子線程 thread.start(); //主線程休眠1s,以便中斷當(dāng)前讓子線程輸出 Thread.sleep(1000); //中斷子線程 logger.warning("main thread interrupted thread"); thread.interrupt(); //等待子線程執(zhí)行完畢 thread.join(); logger.info("main is over"); } }
在如上代碼中,子線程thread
通過(guò)檢查當(dāng)前線程中斷標(biāo)志來(lái)控制是否退出循環(huán),主線程在休眠1s后調(diào)用了thread
的interupted()
方法設(shè)置了中斷標(biāo)志,所以線程thread退出了循環(huán)。
下面看一種情況,當(dāng)線程為了等待一些特定條件的到來(lái)時(shí)候,一般會(huì)使用sleep()
方法,wait()
,join()
方法來(lái)阻塞掛起當(dāng)前線程。下面看一個(gè)例子:
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(); //確保子線程進(jìn)入睡眠狀態(tài) Thread.sleep(1000); //打斷子線程睡眠,讓子線程從sleep返回 threadOne.interrupt(); //等待子線程執(zhí)行完畢 threadOne.join(); logger.info("main thread is over"); } }
到此這篇關(guān)于Java并發(fā)編程之線程中斷的文章就介紹到這了,更多相關(guān)Java線程中斷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot2.6.x的啟動(dòng)流程與自動(dòng)配置詳解
這篇文章主要給大家介紹了關(guān)于Springboot2.6.x的啟動(dòng)流程與自動(dòng)配置的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01Java之System.getProperty()的作用及使用說(shuō)明
這篇文章主要介紹了Java之System.getProperty()的作用及使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04JAVA線程池監(jiān)控以及動(dòng)態(tài)調(diào)整示例詳解
這篇文章主要為大家介紹了JAVA線程池監(jiān)控以及動(dòng)態(tài)調(diào)整示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09SpringBoot使用Prometheus實(shí)現(xiàn)監(jiān)控
在當(dāng)今的軟件開(kāi)發(fā)世界中,監(jiān)控是至關(guān)重要的一部分,本文主要介紹了如何在Spring Boot應(yīng)用程序中使用Prometheus進(jìn)行監(jiān)控,以幫助大家更好地理解和管理您的應(yīng)用程序,有需要的可以參考下2023-10-10關(guān)于spring中bean注冊(cè)的優(yōu)先級(jí)分析
Spring框架中,Bean的定義方式主要有三種:XML定義、注解掃描和配置類中的@Bean注解,在Bean注冊(cè)過(guò)程中,XML定義的GenericBeanDefinition優(yōu)先級(jí)最高2024-09-09