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

java高并發(fā)的線程中斷的幾種方式詳解

 更新時間:2021年10月27日 10:27:26   作者:路人甲Java  
這篇文章主要介紹了Java線程中斷機制幾種方法及示例,向大家分享了這幾種方法的介紹幾代碼示例,具有一定參考價值,需要的朋友可以了解下。

通過一個變量控制線程中斷

代碼:

package com.itsoku.chat05;	
import java.util.concurrent.TimeUnit;	
/**	
 * 微信公眾號:路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請關(guān)注!	
 */	
public class Demo1 {	
    public volatile static boolean exit = false;	
    public static class T extends Thread {	
        @Override	
        public void run() {	
            while (true) {	
                //循環(huán)處理業(yè)務(wù)	
                if (exit) {	
                    break;	
                }	
            }	
        }	
    }	
    public static void setExit() {	
        exit = true;	
    }	
    public static void main(String[] args) throws InterruptedException {	
        T t = new T();	
        t.start();	
        TimeUnit.SECONDS.sleep(3);	
        setExit();	
    }	
}

代碼中啟動了一個線程,線程的run方法中有個死循環(huán),內(nèi)部通過exit變量的值來控制是否退出。 TimeUnit.SECONDS.sleep(3);讓主線程休眠3秒,此處為什么使用TimeUnit?TimeUnit使用更方便一些,能夠很清晰的控制休眠時間,底層還是轉(zhuǎn)換為Thread.sleep實現(xiàn)的。程序有個重點:volatile關(guān)鍵字,exit變量必須通過這個修飾,如果把這個去掉,程序無法正常退出。volatile控制了變量在多線程中的可見性,關(guān)于volatile前面的文章中有介紹,此處就不再說了。

通過線程自帶的中斷標志控制

示例代碼:

package com.itsoku.chat05;	
import java.util.concurrent.TimeUnit;	
/**	
 * 微信公眾號:路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請關(guān)注!	
 */	
public class Demo2 {	
    public static class T extends Thread {	
        @Override	
        public void run() {	
            while (true) {	
                //循環(huán)處理業(yè)務(wù)	
                if (this.isInterrupted()) {	
                    break;	
                }	
            }	
        }	
    }	
    public static void main(String[] args) throws InterruptedException {	
        T t = new T();	
        t.start();	
        TimeUnit.SECONDS.sleep(3);	
        t.interrupt();	
    }	
}

運行上面的程序,程序可以正常結(jié)束。線程內(nèi)部有個中斷標志,當調(diào)用線程的interrupt()實例方法之后,線程的中斷標志會被置為true,可以通過線程的實例方法isInterrupted()獲取線程的中斷標志。

線程阻塞狀態(tài)中如何中斷?

示例代碼:

package com.itsoku.chat05;	
import java.util.concurrent.TimeUnit;	
/**	
 * 微信公眾號:路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請關(guān)注!	
 */	
public class Demo3 {	
    public static class T extends Thread {	
        @Override	
        public void run() {	
            while (true) {	
                //循環(huán)處理業(yè)務(wù)	
                //下面模擬阻塞代碼	
                try {	
                    TimeUnit.SECONDS.sleep(1000);	
                } catch (InterruptedException e) {	
                    e.printStackTrace();	
                }	
            }	
        }	
    }	
    public static void main(String[] args) throws InterruptedException {	
        T t = new T();	
        t.start();	
    }	
}

運行上面代碼,發(fā)現(xiàn)程序無法結(jié)束。

在此先補充幾點知識:

1.調(diào)用線程的interrupt()實例方法,線程的中斷標志會被置為true

2.當線程處于阻塞狀態(tài)時,調(diào)用線程的interrupt()實例方法,線程內(nèi)部會觸發(fā)InterruptedException異常,并且會清除線程內(nèi)部的中斷標志(即將中斷標志置為false)

那么上面代碼可以調(diào)用線程的interrupt()方法來引發(fā)InterruptedException異常,來中斷sleep方法導致的阻塞,調(diào)整一下代碼,如下:

package com.itsoku.chat05;	
import java.util.concurrent.TimeUnit;	
/**	
 * 微信公眾號:路人甲Java,專注于java技術(shù)分享(帶你玩轉(zhuǎn) 爬蟲、分布式事務(wù)、異步消息服務(wù)、任務(wù)調(diào)度、分庫分表、大數(shù)據(jù)等),喜歡請關(guān)注!	
 */	
public class Demo3 {	
    public static class T extends Thread {	
        @Override	
        public void run() {	
            while (true) {	
                //循環(huán)處理業(yè)務(wù)	
                //下面模擬阻塞代碼	
                try {	
                    TimeUnit.SECONDS.sleep(1000);	
                } catch (InterruptedException e) {	
                    e.printStackTrace();	
                    this.interrupt();	
                }	
                if (this.isInterrupted()) {	
                    break;	
                }	
            }	
        }	
    }	
    public static void main(String[] args) throws InterruptedException {	
        T t = new T();	
        t.start();	
        TimeUnit.SECONDS.sleep(3);	
        t.interrupt();	
    }	
}

運行結(jié)果:

java.lang.InterruptedException: sleep interrupted	
    at java.lang.Thread.sleep(Native Method)	
    at java.lang.Thread.sleep(Thread.java:340)	
    at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)	
    at com.itsoku.chat05.Demo3$T.run(Demo3.java:17)

程序可以正常結(jié)束了,分析一下上面代碼,注意幾點:

1.main方法中調(diào)用了t.interrupt()方法,此時線程t內(nèi)部的中斷標志會置為true

2.然后會觸發(fā)run()方法內(nèi)部的InterruptedException異常,所以運行結(jié)果中有異常輸出,上面說了,當觸發(fā)InterruptedException異常時候,線程內(nèi)部的中斷標志又會被清除(變?yōu)閒alse),所以在catch中又調(diào)用了this.interrupt();一次,將中斷標志置為false

3.run()方法中通過this.isInterrupted()來獲取線程的中斷標志,退出循環(huán)(break)

總結(jié)

當一個線程處于被阻塞狀態(tài)或者試圖執(zhí)行一個阻塞操作時,可以使用 Thread.interrupt()方式中斷該線程,注意此時將會拋出一個InterruptedException的異常,同時中斷狀態(tài)將會被復位(由中斷狀態(tài)改為非中斷狀態(tài))

內(nèi)部有循環(huán)體,可以通過一個變量來作為一個信號控制線程是否中斷,注意變量需要volatile修飾

文中的幾種方式可以結(jié)合起來靈活使用控制線程的中斷

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • MybatisPlus lambdaQueryWrapper中常用方法的使用

    MybatisPlus lambdaQueryWrapper中常用方法的使用

    本文主要介紹了MybatisPlus lambdaQueryWrapper中常用方法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 使用SpringEvent解決WebUploader大文件上傳解耦問題

    使用SpringEvent解決WebUploader大文件上傳解耦問題

    Spring Event是Spring框架內(nèi)建的一種發(fā)布/訂閱模式的實現(xiàn),它允許應(yīng)用內(nèi)部不同組件之間通過事件進行通信,本文以WebUploader大文件上傳組件為例,在大文件處理的場景中使用SpringEvent的事件發(fā)布機制,靈活的擴展對文件的處理需求,需要的朋友可以參考下
    2024-07-07
  • 學生視角手把手帶你寫Java?線程池初版

    學生視角手把手帶你寫Java?線程池初版

    作者是一個來自河源的大三在校生,以下筆記都是作者自學之路的一些淺薄經(jīng)驗,如有錯誤請指正,將來會不斷的完善筆記,幫助更多的Java愛好者入門
    2022-03-03
  • Spring?Boot?使用斷言讓你的代碼在上線前就通過“體檢”(最新整理)

    Spring?Boot?使用斷言讓你的代碼在上線前就通過“體檢”(最新整理)

    斷言是一種編程技巧,用于在代碼中插入檢查點,驗證程序的狀態(tài)是否符合預期,如果斷言失敗,程序會拋出一個錯誤,幫助你快速發(fā)現(xiàn)和修復bug,本文給大家介紹Spring?Boot?斷言:讓你的代碼在上線前就通過“體檢”,感興趣的朋友一起看看吧
    2025-03-03
  • MyBatis Plus中代碼生成器使用詳解

    MyBatis Plus中代碼生成器使用詳解

    這篇文章主要介紹了MyBatis Plus中代碼生成器使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 學習Java之如何對時間進行格式化

    學習Java之如何對時間進行格式化

    當我們在默認情況下構(gòu)造出來的時間對象,它的時間格式并不適合我們閱讀,并且在開發(fā)時,pc端、Android端、iOS端等展示的時間格式可能也并不完全一樣,本文就從這幾個問題給大家介紹如何對時間進行格式化,感興趣的同學可以借鑒一下
    2023-05-05
  • MyBatis中的模糊查詢語句

    MyBatis中的模糊查詢語句

    這篇文章主要介紹了MyBatis中的模糊查詢語句的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • java中的Timer和Timertask的關(guān)系解讀

    java中的Timer和Timertask的關(guān)系解讀

    本文詳細介紹了Java中的Timer和TimerTask類,包括它們之間的關(guān)系、API的使用方法、注意事項以及操作案例,Timer是一個調(diào)度器,而TimerTask是具體的任務(wù)類,Timer僅對應(yīng)一個線程,不保證任務(wù)執(zhí)行的精確性,但線程安全,一個Timer可以調(diào)度多個TimerTask
    2024-12-12
  • 基于Maven pom文件使用分析

    基于Maven pom文件使用分析

    本文詳細介紹了Maven項目的核心配置文件pom.xml的結(jié)構(gòu)和各個元素的用途,包括項目基礎(chǔ)信息、依賴管理、倉庫配置、構(gòu)建配置、版本控制、分發(fā)和報告配置等,幫助讀者全面了解Maven項目的構(gòu)建和管理過程
    2024-12-12
  • CountDownLatch源碼解析之a(chǎn)wait()

    CountDownLatch源碼解析之a(chǎn)wait()

    這篇文章主要為大家詳細解析了CountDownLatch源碼之a(chǎn)wait方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04

最新評論

类乌齐县| 常熟市| 绥江县| 金寨县| 宁晋县| 噶尔县| 贡觉县| 湘乡市| 阳泉市| 禄丰县| 盱眙县| 揭西县| 彰化县| 扬州市| 卢氏县| 革吉县| 平山县| 获嘉县| 合水县| 阿巴嘎旗| 章丘市| 墨玉县| 武邑县| 昭平县| 抚宁县| 霍林郭勒市| 舒兰市| 博兴县| 孟州市| 漳平市| 南召县| 驻马店市| 老河口市| 宾阳县| 曲阜市| 象州县| 寿光市| 金溪县| 永丰县| 蛟河市| 东乡族自治县|