最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中斷機(jī)制實(shí)例講解

 更新時(shí)間:2021年01月04日 17:25:56   作者:程序員陳浩  
這篇文章主要介紹了java中斷機(jī)制實(shí)例講解,用了風(fēng)趣幽默的講法,有對(duì)這方面不太懂的同學(xué)可以研究下

一、導(dǎo)言

線程A對(duì)線程B發(fā)出建議: 你好,可以停止了喲~

在實(shí)際生產(chǎn)環(huán)境中,對(duì)于阻塞任務(wù),可能存在一些情況導(dǎo)致阻塞任務(wù)取消、終止,例如: 計(jì)時(shí)器到期,I/O 完成,或者另一個(gè)線程的動(dòng)作(釋放一個(gè)鎖,設(shè)置一個(gè)標(biāo)志,或者將一個(gè)任務(wù)放在一個(gè)工作隊(duì)列中)。這種情況下可以使用java的中斷機(jī)制來(lái)進(jìn)行線程間通信。

java線程中斷的實(shí)現(xiàn)是基于一個(gè)稱為中斷狀態(tài)的內(nèi)部標(biāo)志位來(lái)實(shí)現(xiàn)的,其中斷的含義更像是建議,一個(gè)線程如何響應(yīng)另一個(gè)線程的中斷完全取決于程序員: 繼續(xù)向上拋出、封裝后拋出、中斷狀態(tài)復(fù)原、忽略等。java庫(kù)中的許多拋出 InterruptedException 的方法(例如 sleep)都被設(shè)計(jì)為取消當(dāng)前操作并在接收到中斷時(shí)立即返回。

InterruptException異常就像是一個(gè)聲明,聲明拋出該異常的方法都可被中斷,比如wait、sleep、join。異常都是由可中斷方法自己拋出來(lái)的,并不是直接由interrupt()方法直接引起的。一般來(lái)說(shuō),任何通過(guò)拋出一個(gè) InterruptedException 來(lái)退出的方法都應(yīng)該清除中斷狀態(tài)。

二、java 中斷api

interrupt()

interrupt()方法本質(zhì)上就是通過(guò)調(diào)用java.lang.Thread#interrupt0設(shè)置中斷flag為true,如下代碼演示了該方法的使用: 另啟一個(gè)線程中斷了當(dāng)前線程。

@Test
public void interruptSt() {
 Thread mainThread = Thread.currentThread();
 new Thread(/*將當(dāng)前線程中斷*/mainThread::interrupt).start();
 try {
 //public static native void sleep(long millis) throws InterruptedException;
 Thread.sleep(1_000);
 } catch (InterruptedException e) {
 System.out.println("main 線程被中斷了");
 }
 /*
 * 輸出: main 線程被中斷了
 */
}

interrupted()和isInterrupted()

public boolean isInterrupted() {
 // 設(shè)置this線程的中斷flag,不會(huì)重置中斷flag為true
 return isInterrupted(false);
}
public /*靜態(tài)方法*/static boolean interrupted() {
 // 設(shè)置當(dāng)前線程的中斷flag,重置中斷flag為true
 return currentThread().isInterrupted(true);
}


使用示例

@Test
public void test_Flag() {
 Thread currentThread = Thread.currentThread();
 currentThread.interrupt();
 System.out.println("當(dāng)前線程狀態(tài) =" + currentThread.isInterrupted());
 System.out.println("當(dāng)前線程狀態(tài) =" + Thread.interrupted());
 System.out.println("當(dāng)前線程狀態(tài) =" + Thread.interrupted());
 /* 輸出
 當(dāng)前線程狀態(tài) =true
 當(dāng)前線程狀態(tài) =true
 當(dāng)前線程狀態(tài) =false*/
}

三、如何響應(yīng)中斷?

調(diào)用一個(gè)可中斷的阻塞方法時(shí)需要處理受檢異常InterruptException,一般來(lái)說(shuō)最容易的方式就是繼續(xù)拋出InterruptException ,讓調(diào)用方?jīng)Q定對(duì)中斷事件作出什么應(yīng)對(duì)。但是對(duì)于一些不能在方法頭直接添加異常聲明的,可以catch出后再進(jìn)行一些操作,例如使用Runnable時(shí):

image-20210102214450199

一般來(lái)說(shuō)當(dāng)catch到中斷時(shí),應(yīng)該對(duì)中斷狀態(tài)進(jìn)行還原: 調(diào)用Thread.currentThread().interrupt();,除非明確自己的操作不會(huì)丟失線程中斷的證據(jù),從而剝奪了上層棧的代碼處理中斷的機(jī)會(huì)。

四、總結(jié)

對(duì)目標(biāo)線程調(diào)用interrupt()方法可以請(qǐng)求中斷一個(gè)線程,目標(biāo)線程通過(guò)檢測(cè)isInterrupted()標(biāo)志獲取自身是否已中斷。如果目標(biāo)線程處于阻塞狀態(tài),該線程會(huì)捕獲到InterruptedException。一般來(lái)說(shuō)不要catchInterruptException后不做處理(“生吞中斷”)。

五、參考文章

https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

處理 InterruptedException

JAVA多線程之中斷機(jī)制(如何處理中斷?)

中斷線程

JAVA多線程之中斷機(jī)制(如何處理中斷?)

Thread的中斷機(jī)制(interrupt)

到此這篇關(guān)于java中斷機(jī)制實(shí)例講解的文章就介紹到這了,更多相關(guān)java中斷機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Java注解和動(dòng)態(tài)代理

    淺談Java注解和動(dòng)態(tài)代理

    這篇文章主要介紹了Java中有關(guān)注解和動(dòng)態(tài)代理的一些知識(shí),涉及了Annotation、數(shù)據(jù)類型等相關(guān)內(nèi)容,需要的朋友可以參考下。
    2017-09-09
  • Spring Boot整合EasyExcel(完整版包含上傳解析excel和下載模板)

    Spring Boot整合EasyExcel(完整版包含上傳解析excel和下載模板)

    這篇文章主要介紹了Spring Boot整合EasyExcel(完整版包含上傳解析excel和下載模板),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • gateway和jwt網(wǎng)關(guān)認(rèn)證實(shí)現(xiàn)過(guò)程解析

    gateway和jwt網(wǎng)關(guān)認(rèn)證實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了gateway和jwt網(wǎng)關(guān)認(rèn)證實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java并發(fā)編程之工具類Semaphore的使用

    Java并發(fā)編程之工具類Semaphore的使用

    目前幾乎所有的語(yǔ)言都支持信號(hào)量機(jī)制,Java也不例外.Java中提供了Semaphore并發(fā)工具類來(lái)支持信號(hào)量機(jī)制,下面我們就來(lái)了解Java實(shí)現(xiàn)的信號(hào)量機(jī)制,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • Java JDBC自定義封裝工具類的步驟和完整代碼

    Java JDBC自定義封裝工具類的步驟和完整代碼

    這篇文章主要給大家介紹了關(guān)于Java JDBC自定義封裝工具類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 深入解析Java的Servlet過(guò)濾器的原理及其應(yīng)用

    深入解析Java的Servlet過(guò)濾器的原理及其應(yīng)用

    這篇文章主要介紹了深入解析Java的Servlet過(guò)濾器的原理及應(yīng)用,Java編寫(xiě)的Servlet通常是一個(gè)與網(wǎng)頁(yè)一起作用于瀏覽器客戶端的程序,需要的朋友可以參考下
    2016-01-01
  • java隊(duì)列之queue用法實(shí)例分析

    java隊(duì)列之queue用法實(shí)例分析

    這篇文章主要介紹了java隊(duì)列之queue用法實(shí)例分析,Queue 隊(duì)列就是一個(gè)先入先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),Queue接口繼承Collection接口。感興趣的可以了解一下
    2020-07-07
  • Springboot上傳excel并將表格數(shù)據(jù)導(dǎo)入或更新mySql數(shù)據(jù)庫(kù)的過(guò)程

    Springboot上傳excel并將表格數(shù)據(jù)導(dǎo)入或更新mySql數(shù)據(jù)庫(kù)的過(guò)程

    這篇文章主要介紹了Springboot上傳excel并將表格數(shù)據(jù)導(dǎo)入或更新mySql數(shù)據(jù)庫(kù)的過(guò)程 ,本文以Controller開(kāi)始,從導(dǎo)入過(guò)程開(kāi)始講述,其中包括字典表的轉(zhuǎn)換,需要的朋友可以參考下
    2018-04-04
  • Java內(nèi)部排序之插入排序與交換排序詳解

    Java內(nèi)部排序之插入排序與交換排序詳解

    這篇文章主要介紹了Java內(nèi)部排序之插入排序與交換排序詳解,排序是將任意序列重新排列按照關(guān)鍵字有序,排序根基存儲(chǔ)器的不同分為內(nèi)部排序、外部排序,排序根據(jù)關(guān)鍵字分為穩(wěn)定排序、不穩(wěn)定排序,需要的朋友可以參考下
    2023-12-12
  • Java多線程中的ThreadPoolExecutor使用解析

    Java多線程中的ThreadPoolExecutor使用解析

    這篇文章主要介紹了Java多線程中的ThreadPoolExecutor使用解析,作為線程池的緩沖,當(dāng)新增線程超過(guò)maximumPoolSize時(shí),會(huì)將新增線程暫時(shí)存放到該隊(duì)列中,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

浦东新区| 鹤山市| 桃江县| 丰县| 祁东县| 宜城市| 个旧市| 巨野县| 深泽县| 孟津县| 德兴市| 武安市| 墨脱县| 宣武区| 弥勒县| 舞钢市| 左权县| 南昌县| 平昌县| 乐安县| 青海省| 射洪县| 怀化市| 团风县| 赣榆县| 苏州市| 定西市| 海林市| 崇明县| 获嘉县| 三亚市| 彭州市| 龙里县| 四会市| 天门市| 三台县| 屯昌县| 海盐县| 南通市| 绥中县| 扬中市|