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

Java線程中斷interrupt的常用方法

 更新時(shí)間:2022年06月15日 11:14:17   作者:smileluck  
本文主要介紹了Java線程中斷interrupt的常用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

這里主要探討中斷常用的三個(gè)方法:

  • interrupt()。在一個(gè)線程中調(diào)用需要中斷現(xiàn)成的interrupt()方法,會(huì)對(duì)該線程發(fā)出信號(hào),將中斷狀態(tài)標(biāo)志為true
  • isInterrupted()。判斷當(dāng)前線程的中斷狀態(tài)。
  • interrupted()。將線程的中斷狀態(tài)恢復(fù)。

主要使用的阻塞三個(gè)方法:

  • Object#wait。放棄鎖+等待+重新獲取鎖
  • Thread#join?!緟f(xié)作】等待某個(gè)線程執(zhí)行完畢
  • Thread#sleep。靜態(tài)方法,線程休眠并讓出CPU時(shí)間片

==注意:interrupt()不能中斷在運(yùn)行中的線程,它只能改變中斷狀態(tài)而已。實(shí)際完成的是讓受阻塞的線程退出阻塞狀態(tài)。==
確切的說(shuō):是被三種方法之一阻塞時(shí),調(diào)用該線程的interrupt()方法,那么線程將拋出一個(gè)個(gè)InterruptedException中斷異常,從而提早地終結(jié)被阻塞狀態(tài)。

示例說(shuō)明

public class Runner3 implements Runnable {
? ? @Override
? ? public void run() {
? ? ? ? while (true) {
? ? ? ? ? ? if (Thread.currentThread().isInterrupted()) {
? ? ? ? ? ? ? ? System.out.println("我進(jìn)入中斷了,但我還在跑");
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? System.out.println("我沒有進(jìn)入中斷");
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ??
? ? public static void main(String[] args) {

? ? ? ? Runner3 runner3 = new Runner3();
? ? ? ? Thread thread3 = new Thread(runner3);
? ? ? ? thread3.start();

? ? ? ? try {
? ? ? ? ? ? Thread.sleep(2000);
? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }

? ? ? ? thread3.interrupt();
? ? }
}

輸出結(jié)果大致如下:

我沒有進(jìn)入中斷
我沒有進(jìn)入中斷
我進(jìn)入中斷了,但我還在跑
我進(jìn)入中斷了,但我還在跑
我進(jìn)入中斷了,但我還在跑
...

這里看到,執(zhí)行interrupt()后,對(duì)線程執(zhí)行中斷后依然在執(zhí)行,線程依然在運(yùn)行。

我們調(diào)整一下run方法

   public void run() {
        while (true) {
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("我進(jìn)入中斷了,但我還在跑");
                Thread.interrupted();//重置狀態(tài)
            } else {
                System.out.println("我沒有進(jìn)入中斷");
            }
        }
    }

輸出結(jié)果如下:

我沒有進(jìn)入中斷
我沒有進(jìn)入中斷
我進(jìn)入中斷了,但我還在跑
我沒有進(jìn)入中斷
我沒有進(jìn)入中斷
...

這里看到中斷的狀態(tài)重置了,那么我們?nèi)绾稳?yīng)用這個(gè)中斷狀態(tài)呢?

注意事項(xiàng)

  • 當(dāng)線程A執(zhí)行到wait(),sleep(),join()時(shí),拋出InterruptedException后,中斷狀態(tài)已經(jīng)被系統(tǒng)復(fù)位了,線程A調(diào)用Thread.interrupted()返回的是false。
  • 如果線程被調(diào)用了interrupt(),此時(shí)該線程并不在阻塞狀態(tài)時(shí),下次執(zhí)行wait(),sleep(),join()時(shí),一樣會(huì)拋出InterruptedException,當(dāng)然拋出后該線程的中斷狀態(tài)也會(huì)被系統(tǒng)復(fù)位。

案例1

public class Runner3 implements Runnable {
? ? @Override
? ? public void run() {
? ? ? ? while (true) {
? ? ? ? ? ? if (Thread.currentThread().isInterrupted()) {
? ? ? ? ? ? ? ? System.out.println("我進(jìn)入中斷了,但我還在跑");
// ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Thread.sleep(5000);
? ? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? System.out.println("2"+Thread.currentThread().isInterrupted());
? ? ? ? ? ? ? ? ? ? //輸出false
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? System.out.println("我沒有進(jìn)入中斷");
? ? ? ? ? ? }
? ? ? ? ? ??
? ? ? ? }
? ? }

? ? public static void main(String[] args) {
? ? ? ? Runner3 runner3 = new Runner3();
? ? ? ? Thread thread3 = new Thread(runner3);
? ? ? ? thread3.start();
? ? ? ? try {
? ? ? ? ? ? Thread.sleep(2000);
? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? thread3.interrupt();
? ? }
}

執(zhí)行上面的代碼,我們可以看到在拋出異常后,Thread.currentThread().isInterrupted()輸出為false,證明線程的中斷狀態(tài)已經(jīng)復(fù)位了。
另外因?yàn)槲覀兪窍葓?zhí)行了interrupt()然后再進(jìn)入睡眠狀態(tài),但是依然拋出了異常。

Object#wait 和 Thread.sleep 差異在哪里

因?yàn)镺bject#wait方法會(huì)阻塞線程,所以當(dāng)我們執(zhí)行interrupt時(shí),會(huì)拋出InterruptedException異常。
那么Object#wait方法阻塞線程會(huì)導(dǎo)致的差異在哪里?
==最主要的差別在于sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其它線程可以使用同步控制塊或者方法。==

總結(jié)

  • 調(diào)用interrupt方法,會(huì)改變中斷狀態(tài),但不會(huì)影響線程的運(yùn)行狀態(tài)。
  • 當(dāng)執(zhí)行了interrupt方法改變中斷狀態(tài)后,線程若執(zhí)行Object#wait,Thread#sleep和Thread#join都會(huì)拋出InterruptedException異常,然后復(fù)位中斷狀態(tài)
  • 當(dāng)執(zhí)行了interrupt方法改變中斷狀態(tài)后,線程未阻塞,且將要執(zhí)行Object#wait,Thread#sleep和Thread#join阻塞線程時(shí),都會(huì)拋出InterruptedException異常,復(fù)位中斷狀態(tài)。

到此這篇關(guān)于Java線程中斷interrupt的常用方法的文章就介紹到這了,更多相關(guān)Java線程中斷interrupt內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • jpanel設(shè)置背景圖片的二個(gè)小例子

    jpanel設(shè)置背景圖片的二個(gè)小例子

    這篇文章主要介紹了jpanel設(shè)置背景圖片的二個(gè)小例子,實(shí)現(xiàn)了動(dòng)態(tài)加載圖片做背景的方法,需要的朋友可以參考下
    2014-03-03
  • Java Object定義三個(gè)點(diǎn)實(shí)現(xiàn)代碼

    Java Object定義三個(gè)點(diǎn)實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java Object定義三個(gè)點(diǎn)實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java實(shí)現(xiàn)Redisson看門狗機(jī)制

    java實(shí)現(xiàn)Redisson看門狗機(jī)制

    redission看門狗機(jī)制是解決分布式鎖的續(xù)約問(wèn)題,本文就來(lái)詳細(xì)的介紹一下java實(shí)現(xiàn)Redisson看門狗機(jī)制,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • idea遠(yuǎn)程調(diào)試spark的步驟講解

    idea遠(yuǎn)程調(diào)試spark的步驟講解

    今天小編就為大家分享一篇關(guān)于idea遠(yuǎn)程調(diào)試spark的步驟講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Spring boot調(diào)用Oracle存儲(chǔ)過(guò)程的兩種方式及完整代碼

    Spring boot調(diào)用Oracle存儲(chǔ)過(guò)程的兩種方式及完整代碼

    這篇文章主要給大家介紹了關(guān)于Spring boot調(diào)用Oracle存儲(chǔ)過(guò)程的兩種方式及完整代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 全面解釋Java中的serialVersionUID

    全面解釋Java中的serialVersionUID

    以下是對(duì)Java中的serialVersionUID進(jìn)行了全面的分析介紹。需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • Struts2之Validator驗(yàn)證框架的詳細(xì)介紹

    Struts2之Validator驗(yàn)證框架的詳細(xì)介紹

    Struts2中提供了數(shù)據(jù)校驗(yàn)驗(yàn)證數(shù)據(jù)例如驗(yàn)證郵件、數(shù)字等,本篇文章介紹了Struts2之Validator的詳細(xì)介紹,有興趣的可以了解一下。
    2017-03-03
  • springboot讀取nacos配置文件的實(shí)現(xiàn)

    springboot讀取nacos配置文件的實(shí)現(xiàn)

    SpringBoot注冊(cè)服務(wù)到Nacos上,由Nacos來(lái)做服務(wù)的管理,本文主要介紹了springboot讀取nacos配置文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • MyBatis基礎(chǔ)支持DataSource實(shí)現(xiàn)源碼解析

    MyBatis基礎(chǔ)支持DataSource實(shí)現(xiàn)源碼解析

    這篇文章主要為大家介紹了MyBatis基礎(chǔ)支持DataSource實(shí)現(xiàn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java中的方法、常量、變量、參數(shù)用例詳解

    Java中的方法、常量、變量、參數(shù)用例詳解

    在JVM的運(yùn)轉(zhuǎn)中,承載的是數(shù)據(jù),而數(shù)據(jù)的一種變現(xiàn)形式就是“量”,量分為:常量與變量,我們?cè)跀?shù)學(xué)和物理學(xué)中已經(jīng)接觸過(guò)變量的概念了,在Java中的變量就是在程序運(yùn)行過(guò)程中可以改變其值的量,這篇文章主要介紹了Java中的方法、常量、變量、參數(shù),需要的朋友可以參考下
    2024-01-01

最新評(píng)論

定兴县| 噶尔县| 昭通市| 菏泽市| 镶黄旗| 喜德县| 会泽县| 桐城市| 伊金霍洛旗| 永寿县| 抚松县| 苍山县| 清涧县| 黄大仙区| 晋宁县| 深泽县| 涟源市| 新晃| 远安县| 南阳市| 紫金县| 公安县| 太和县| 义乌市| 乌拉特中旗| 霞浦县| 平顺县| 平陆县| 苍溪县| 新密市| 牙克石市| 绍兴县| 游戏| 盐山县| 横峰县| 天长市| 铜梁县| 常山县| 开江县| 合作市| 什邡市|