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

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

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

前言

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

  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()等阻塞方法上才會(huì)需要拋InterruptedException

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

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

2.在主線程中,啟動(dòng)線程t1后,那么就打斷線程t1;

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

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

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

簡(jiǎn)單翻譯如下:如果任何線程打斷當(dāng)前線程,當(dāng)前線程的打斷標(biāo)記在InterruptedException拋出時(shí)會(huì)被清除掉。

所以說(shuō),我們?cè)诓蹲降?code>InterruptedException后想要再拿到線程t1的打斷標(biāo)記基本上是不可能的。

interrupt()的作用

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

  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++;
        // 判斷是否有打斷標(biāo)記
        if(Thread.currentThread().isInterrupted()){
          System.out.println("線程被打斷,跳出循環(huán)");
          // 如果有打斷標(biāo)記,就跳出循環(huán)
          break;
        }
      }
    });
    // 啟動(dòng)線程t1
    t1.start();
    // 打斷線程t1
    t1.interrupt();
    // 等待線程t1執(zhí)行完畢
    t1.join();
  }

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

2.在非阻塞代碼中,我們是可以拿到線程t1的打斷標(biāo)記的,也就是說(shuō),非阻塞代碼不會(huì)清除線程的打斷標(biāo)記;

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

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

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

根據(jù)上面源碼,我們發(fā)現(xiàn)了interrupted()是一個(gè)靜態(tài)方法,是可以直接通過(guò)Thread.interrupted()調(diào)用的;isInterrupted()方法是線程對(duì)象方法,是需要通過(guò)線程對(duì)象調(diào)用的;我們?cè)谇懊娲a中使用Thread.currentThread().isInterrupted()就是通過(guò)線程對(duì)象調(diào)用的;

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

小結(jié)

通過(guò)上述示例演示,我們可以總結(jié)出如下幾點(diǎn):

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

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

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

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

相關(guān)文章

  • SpringBoot發(fā)現(xiàn)最新版Druid重大問(wèn)題(坑)

    SpringBoot發(fā)現(xiàn)最新版Druid重大問(wèn)題(坑)

    這篇文章主要介紹了SpringBoot發(fā)現(xiàn)最新版Druid重大問(wèn)題(坑),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java日期格式化如何避免YYYY引發(fā)的時(shí)間異常

    Java日期格式化如何避免YYYY引發(fā)的時(shí)間異常

    在編程中,日期格式化是一個(gè)常見(jiàn)的任務(wù),使用不同的格式化選項(xiàng)可能會(huì)導(dǎo)致一些意外的結(jié)果,下面我們就來(lái)學(xué)習(xí)一下Java如何避免YYYY引發(fā)的時(shí)間異常吧
    2023-11-11
  • Java的AQS基本原理詳細(xì)分析

    Java的AQS基本原理詳細(xì)分析

    這篇文章主要介紹了Java的AQS基本原理詳細(xì)分析,AQS是Abstract Queued Synchronizer的簡(jiǎn)稱,AQS提供了一種實(shí)現(xiàn)阻塞鎖和一系列依賴FIFO等待隊(duì)列的同步器的框架,本文主要講解分析其基本原理,需要的朋友可以參考下
    2024-01-01
  • SpringBoot利用MDC機(jī)制過(guò)濾單次請(qǐng)求的所有日志

    SpringBoot利用MDC機(jī)制過(guò)濾單次請(qǐng)求的所有日志

    在服務(wù)出現(xiàn)故障時(shí),我們經(jīng)常需要獲取一次請(qǐng)求流程里的所有日志進(jìn)行定位 ,如何將一次數(shù)據(jù)上報(bào)請(qǐng)求中包含的所有業(yè)務(wù)日志快速過(guò)濾出來(lái),就是本文要介紹的,需要的朋友可以參考下
    2024-04-04
  • Mybatis?plus?where添加括號(hào)方式

    Mybatis?plus?where添加括號(hào)方式

    這篇文章主要介紹了Mybatis?plus?where添加括號(hào)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Lombok和MapStruct整合詳情

    Lombok和MapStruct整合詳情

    這篇文章主要介紹了Lombok和MapStruct整合詳情,文章基于Java的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • java解析任意層數(shù)json字符串的方法

    java解析任意層數(shù)json字符串的方法

    一個(gè)方法解析任意層數(shù)的json字符竄:使用正則表達(dá)式,遞歸算法,將jsonArray解析出后添加到List, JsonObject添加至Map
    2014-02-02
  • Java Iterator迭代器與foreach循環(huán)代碼解析

    Java Iterator迭代器與foreach循環(huán)代碼解析

    這篇文章主要介紹了Java-Iterator迭代器與foreach循環(huán),主要包括Iterator迭代器接口的操作方法和foreach 循環(huán)語(yǔ)法解析,需要的朋友可以參考下
    2022-04-04
  • Java實(shí)現(xiàn)在線考試系統(tǒng)與設(shè)計(jì)(學(xué)生功能)

    Java實(shí)現(xiàn)在線考試系統(tǒng)與設(shè)計(jì)(學(xué)生功能)

    這篇文章主要介紹了Java實(shí)現(xiàn)在線考試系統(tǒng)與設(shè)計(jì)(學(xué)生功能),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java SpringBoot模板引擎之 Thymeleaf入門(mén)詳解

    Java SpringBoot模板引擎之 Thymeleaf入門(mén)詳解

    jsp有著強(qiáng)大的功能,能查出一些數(shù)據(jù)轉(zhuǎn)發(fā)到JSP頁(yè)面以后,我們可以用jsp輕松實(shí)現(xiàn)數(shù)據(jù)的顯示及交互等,包括能寫(xiě)Java代碼。但是,SpringBoot首先是以jar的方式,不是war;其次我們的tomcat是嵌入式的,所以現(xiàn)在默認(rèn)不支持jsp
    2021-10-10

最新評(píng)論

墨玉县| 浦北县| 江津市| 阿坝| 巴彦淖尔市| 丹巴县| 扎鲁特旗| 清水县| 榆社县| 襄垣县| 罗田县| 琼结县| 雷波县| 罗定市| 封丘县| 五河县| 阳高县| 敦煌市| 和平区| 元阳县| 固安县| 延长县| 英山县| 台东县| 惠东县| 东宁县| 叶城县| 平阴县| 安国市| 忻城县| 阿拉善盟| 敦煌市| 突泉县| 华坪县| 杨浦区| 海原县| 太原市| 获嘉县| 海南省| 汉中市| 阿图什市|