欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中斷機制實例講解

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

一、導言

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

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

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

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

二、java 中斷api

interrupt()

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

@Test
public void interruptSt() {
 Thread mainThread = Thread.currentThread();
 new Thread(/*將當前線程中斷*/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() {
 // 設置this線程的中斷flag,不會重置中斷flag為true
 return isInterrupted(false);
}
public /*靜態(tài)方法*/static boolean interrupted() {
 // 設置當前線程的中斷flag,重置中斷flag為true
 return currentThread().isInterrupted(true);
}


使用示例

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

三、如何響應中斷?

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

image-20210102214450199

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

四、總結(jié)

對目標線程調(diào)用interrupt()方法可以請求中斷一個線程,目標線程通過檢測isInterrupted()標志獲取自身是否已中斷。如果目標線程處于阻塞狀態(tài),該線程會捕獲到InterruptedException。一般來說不要catchInterruptException后不做處理(“生吞中斷”)。

五、參考文章

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

處理 InterruptedException

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

中斷線程

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

Thread的中斷機制(interrupt)

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

相關(guān)文章

  • Java反射在實際工作中的應用筆記

    Java反射在實際工作中的應用筆記

    這篇文章主要介紹了Java反射在實際工作中的應用筆記,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • JAVA 16位ID生成工具類含16位不重復的隨機數(shù)數(shù)字+大小寫

    JAVA 16位ID生成工具類含16位不重復的隨機數(shù)數(shù)字+大小寫

    這篇文章主要介紹了JAVA 16位ID生成工具類含16位不重復的隨機數(shù)數(shù)字+大小寫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Java中常見延時隊列的實現(xiàn)方案小結(jié)(建議收藏)

    Java中常見延時隊列的實現(xiàn)方案小結(jié)(建議收藏)

    延時隊列它要具有隊列的特性,再給它附加一個延遲消費隊列消息的功能,也就是說可以指定隊列中的消息在哪個時間點被消費,這篇文章主要介紹了Java中常見延時隊列的實現(xiàn)方案總結(jié),需要的朋友可以參考下
    2024-04-04
  • 跟我學Java Swing之游戲設計(2)

    跟我學Java Swing之游戲設計(2)

    跟我學Java Swing之游戲設計(2)...
    2006-12-12
  • SpringMVC 整合SSM框架詳解

    SpringMVC 整合SSM框架詳解

    這篇文章主要介紹了SpringMVC 整合SSM框架詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot模板引擎之Thymeleaf的使用

    SpringBoot模板引擎之Thymeleaf的使用

    這篇文章主要介紹了SpringBoot模板引擎之Thymeleaf的使用,模板引擎是以業(yè)務邏輯層和表現(xiàn)層分離為目的的,將規(guī)定格式的模板代碼轉(zhuǎn)換為業(yè)務數(shù)據(jù)的算法實現(xiàn),它可以是一個過程代碼、一個類,甚至是一個類庫,需要的朋友可以參考下
    2023-10-10
  • IDEA配置java開發(fā)環(huán)境(maven、gradle、tomcat)

    IDEA配置java開發(fā)環(huán)境(maven、gradle、tomcat)

    這篇文章主要介紹了IDEA配置java開發(fā)環(huán)境(maven、gradle、tomcat),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Spring中property-placeholder的使用與解析詳解

    Spring中property-placeholder的使用與解析詳解

    本篇文章主要介紹了Spring中property-placeholder的使用與解析詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Integer和int的區(qū)別實例詳解

    Integer和int的區(qū)別實例詳解

    這篇文章主要介紹了Integer和int的區(qū)別實例詳解,文字和代碼實例講解的很清楚,有感興趣的同學可以學習下
    2021-03-03
  • Dubbo3的Spring適配原理與初始化流程源碼解析

    Dubbo3的Spring適配原理與初始化流程源碼解析

    這篇文章主要為大家介紹了Dubbo3的Spring適配原理與初始化流程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論