亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Thread類interrupt interrupted及isInterrupted區(qū)別

 更新時間:2022年10月27日 15:20:45   作者:夢想實現(xiàn)家_Z  
這篇文章主要為大家介紹了Thread類interrupt interrupted及isInterrupted區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

在java Thread類中,我們會看到interrupt()、interrupted()及isInterrupted(),在大多數(shù)情況下,我們都不會使用到它們,但是有一個InterruptedException類我們應該是經常會遇到的,例如:

  public static void main(String[] args) {
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

那么你知道InterruptedException異常是如何觸發(fā)的嘛?

如何觸發(fā)InterruptedException

我們發(fā)現(xiàn),在sleep()、wait()、join()等阻塞方法上才會需要拋InterruptedException

  public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(() -> {
      try {
        // 執(zhí)行睡眠1秒,馬上會被主線程打斷
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        // 觸發(fā)InterruptedException異常
        e.printStackTrace();
        // 打印是否被打斷
        System.out.println(Thread.currentThread().isInterrupted());
      }
    });
    // 主線程啟動線程t1
    t1.start();
    // 主線程打斷t1
    t1.interrupt();
    // 等等t1執(zhí)行完畢
    t1.join();
  }

1.我們創(chuàng)建了一個線程對象t1,t1執(zhí)行邏輯就是sleep 1秒鐘;不過我們會發(fā)現(xiàn)線程t1根本sleep不了那么久,因為主線程馬上就會打斷它;線程t1被打斷后,會打印出異常堆棧,并輸出線程t1的打斷標記;

2.在主線程中,啟動線程t1后,那么就打斷線程t1;

3.等待線程t1邏輯全部執(zhí)行完畢后主線程退出;

我們會發(fā)現(xiàn),輸出的線程t1的打斷標記一致是false;咱們明明已經調用了t1.interrupt(),并且也觸發(fā)了InterruptedException異常,這到底是為什么導致上面代碼線程t1的打斷標記一直是false呢?

我們從JDK源碼中找到了這樣一段注釋:

簡單翻譯如下:如果任何線程打斷當前線程,當前線程的打斷標記在InterruptedException拋出時會被清除掉。

所以說,我們在捕捉到InterruptedException后想要再拿到線程t1的打斷標記基本上是不可能的。

interrupt()的作用

在Thread中,我們調用interrupt()并不會阻止目標線程繼續(xù)執(zhí)行,它只是給目標線程打上一個標記:

  public static void main(String[] args) throws InterruptedException {
    // 創(chuàng)建線程t1
    Thread t1 = new Thread(() -> {
      int i = 0;
      // 循環(huán)自增
      while (true) {
        System.out.println(i);
        i++;
        // 判斷是否有打斷標記
        if(Thread.currentThread().isInterrupted()){
          System.out.println("線程被打斷,跳出循環(huán)");
          // 如果有打斷標記,就跳出循環(huán)
          break;
        }
      }
    });
    // 啟動線程t1
    t1.start();
    // 打斷線程t1
    t1.interrupt();
    // 等待線程t1執(zhí)行完畢
    t1.join();
  }

1.在上述代碼中,如果刪掉break代碼,那么線程t1會一直死循環(huán),說明interrupt()是無法阻止線程t1執(zhí)行的;

2.在非阻塞代碼中,我們是可以拿到線程t1的打斷標記的,也就是說,非阻塞代碼不會清除線程的打斷標記;

interrupted()及isInterrupted()的區(qū)別

我們可以看一下Thread類中這兩個方法的源代碼:

    // 靜態(tài)方法,調用當前線程的isInterrupted(true)
    public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }
    // 對象方法,調用當前線程對象的isInterrupted(false)
    public boolean isInterrupted() {
        return isInterrupted(false);
    }

根據(jù)上面源碼,我們發(fā)現(xiàn)了interrupted()是一個靜態(tài)方法,是可以直接通過Thread.interrupted()調用的;isInterrupted()方法是線程對象方法,是需要通過線程對象調用的;我們在前面代碼中使用Thread.currentThread().isInterrupted()就是通過線程對象調用的;

另一個區(qū)別就是兩個方法傳遞的參數(shù)不同,interrupted()傳遞的true,isInterrupted()傳遞的是false;這兩個參數(shù)的作用是是否清除打斷標記,也就是說,如果調用Thread.interrupted()返回true后,我們的打斷標記會被清除,那么再次調用Thread.interrupted()拿到的就是false;isInterrupted()方法就不會清除打斷標記,每次調用isInterrupted()結果都不變;

小結

通過上述示例演示,我們可以總結出如下幾點:

1.interrupt()作用是給目標線程打上打斷標記,并不會阻止目標線程的繼續(xù)執(zhí)行;

2.出現(xiàn)InterruptedException后,打斷標記會被清除;

3.interrupted()是靜態(tài)方法,并且會清除線程打斷標記;isInterrupted()是線程對象方法,不會清除打斷標記;

以上就是Thread類interrupt interrupted及isInterrupted區(qū)別的詳細內容,更多關于Thread類interrupt interrupted的資料請關注腳本之家其它相關文章!

相關文章

  • spring?boot如何配置靜態(tài)路徑詳解(404出現(xiàn)的坑)

    spring?boot如何配置靜態(tài)路徑詳解(404出現(xiàn)的坑)

    這篇文章主要給大家介紹了關于spring?boot如何配置靜態(tài)路徑的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-02-02
  • SWT(JFace)小制作 BugTracker

    SWT(JFace)小制作 BugTracker

    SWT(JFace)小制作 BugTracker
    2009-06-06
  • Spring Boot2.0中SpringWebContext找不到無法使用的解決方法

    Spring Boot2.0中SpringWebContext找不到無法使用的解決方法

    這篇文章主要給大家介紹了關于Spring Boot2.0中SpringWebContext找不到無法使用的解決方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-12-12
  • Java經典面試題匯總:Spring

    Java經典面試題匯總:Spring

    本篇總結的是Spring框架相關的面試題,后續(xù)會持續(xù)更新,希望我的分享可以幫助到正在備戰(zhàn)面試的實習生或者已經工作的同行,如果發(fā)現(xiàn)錯誤還望大家多多包涵,不吝賜教,謝謝
    2021-07-07
  • SpringBoot使用@Async注解處理異步事件的方法

    SpringBoot使用@Async注解處理異步事件的方法

    在現(xiàn)代應用程序中,異步編程已經成為了必備的技能,異步編程使得應用程序可以同時處理多個請求,從而提高了應用程序的吞吐量和響應速度,在SpringBoot 中,我們可以使用 @Async 注解來實現(xiàn)異步編程,本文將介紹 @Async 注解的使用方法和注意事項
    2023-09-09
  • 詳解Java關鍵字final

    詳解Java關鍵字final

    今天帶大家學習Java基礎知識,文中對關鍵字final作了非常詳細的介紹,對正在學習Java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • 一文帶你探索Java中的通配符與泛型

    一文帶你探索Java中的通配符與泛型

    Java 語言中的泛型是一種強大的特性,它可以將類型參數(shù)化,使得代碼更具通用性和安全性,本文將深入講解 Java 通配符和泛型,有需要的小伙伴可以了解下
    2023-12-12
  • 淺入淺出的講解Spring循環(huán)依賴問題

    淺入淺出的講解Spring循環(huán)依賴問題

    循環(huán)依賴其實就是循環(huán)引用,也就是兩個或則兩個以上的bean互相持有對方,最終形成閉環(huán),下面這篇文章主要給大家介紹了關于Spring循環(huán)依賴問題的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • Spring?Bean中的六種作用域你了解嗎

    Spring?Bean中的六種作用域你了解嗎

    Bean的作用域是指Bean實例的生命周期及可見性范圍,Spring框架定義了6種作用域,本文就來和大家聊聊這6種作用域的定義與使用,希望對大家有所幫助
    2023-09-09
  • JavaSE?XML解析技術的使用方法詳解

    JavaSE?XML解析技術的使用方法詳解

    XML意為可擴展標記語言,被多數(shù)技術人員用以選擇作為數(shù)據(jù)傳輸?shù)妮d體,成為一種通用的數(shù)據(jù)交換格式,下面這篇文章主要給大家介紹了關于JavaSE?XML解析技術的使用方法,需要的朋友可以參考下
    2023-04-04

最新評論