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

java高并發(fā)InterruptedException異常引發(fā)思考

 更新時間:2022年08月30日 15:25:37   作者:冰_河  
這篇文章主要為大家介紹了java高并發(fā)InterruptedException異常引發(fā)思考,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

InterruptedException異??赡軟]你想的那么簡單!

當我們在調用Java對象的wait()方法或者線程的sleep()方法時,需要捕獲并處理InterruptedException異常。如果我們對InterruptedException異常處理不當,則會發(fā)生我們意想不到的后果!

程序案例

例如,下面的程序代碼,InterruptedTask類實現了Runnable接口,在run()方法中,獲取當前線程的句柄,并在while(true)循環(huán)中,通過isInterrupted()方法來檢測當前線程是否被中斷,如果當前線程被中斷就退出while(true)循環(huán),同時,在while(true)循環(huán)中,還有一行Thread.sleep(100)代碼,并捕獲了InterruptedException異常。

整個代碼如下所示。

package io.binghe.concurrent.lab08;
/**
 * @author binghe
 * @version 1.0.0
 * @description 線程測試中斷
 */
public class InterruptedTask implements Runnable{
    @Override
    public void run() {
        Thread currentThread = Thread.currentThread();
        while (true){
            if(currentThread.isInterrupted()){
                break;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

上述代碼的本意是通過isInterrupted()方法檢查線程是否被中斷了,如果中斷了就退出while循環(huán)。其他線程通過調用執(zhí)行線程的interrupt()方法來中斷執(zhí)行線程,此時會設置執(zhí)行線程的中斷標志位,從而使currentThread.isInterrupted()返回true,這樣就能夠退出while循環(huán)。

這看上去沒啥問題啊!但真的是這樣嗎?我們創(chuàng)建一個InterruptedTest類用于測試,代碼如下所示。

package io.binghe.concurrent.lab08;
/**
 * @author binghe
 * @version 1.0.0
 * @description 測試線程中斷
 */
public class InterruptedTest {
    public static void main(String[] args){
        InterruptedTask interruptedTask = new InterruptedTask();
        Thread interruptedThread = new Thread(interruptedTask);
        interruptedThread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        interruptedThread.interrupt();
    }
}

我們運行main方法,如下所示。

這竟然跟我們想象的不一樣!不一樣!不一樣!這是為什么呢?

問題分析

上述代碼明明調用了線程的interrupt()方法來中斷線程,但是卻并沒有起到啥作用。原因是線程的run()方法在執(zhí)行的時候,大部分時間都是阻塞在sleep(100)上,當其他線程通過調用執(zhí)行線程的interrupt()方法來中斷執(zhí)行線程時,大概率的會觸發(fā)InterruptedException異常,在觸發(fā)InterruptedException異常的同時,JVM會同時把線程的中斷標志位清除,所以,這個時候在run()方法中判斷的currentThread.isInterrupted()會返回false,也就不會退出當前while循環(huán)了。

既然問題分析清除了,那如何中斷線程并退出程序呢?

問題解決

正確的處理方式應該是在InterruptedTask類中的run()方法中的while(true)循環(huán)中捕獲異常之后重新設置中斷標志位,所以,正確的InterruptedTask類的代碼如下所示。

package io.binghe.concurrent.lab08;
/**
 * @author binghe
 * @version 1.0.0
 * @description 中斷線程測試
 */
public class InterruptedTask implements Runnable{
    @Override
    public void run() {
        Thread currentThread = Thread.currentThread();
        while (true){
            if(currentThread.isInterrupted()){
                break;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
                currentThread.interrupt();
            }
        }
    }
}

可以看到,我們在捕獲InterruptedException異常的catch代碼塊中新增了一行代碼。

currentThread.interrupt();

這就使得我們捕獲到InterruptedException異常后,能夠重新設置線程的中斷標志位,從而中斷當前執(zhí)行的線程。

我們再次運行InterruptedTest類的main方法,如下所示。

總結

處理InterruptedException異常時要小心,如果在調用執(zhí)行線程的interrupt()方法中斷執(zhí)行線程時,拋出了InterruptedException異常,則在觸發(fā)InterruptedException異常的同時,JVM會同時把執(zhí)行線程的中斷標志位清除,此時調用執(zhí)行線程的isInterrupted()方法時,會返回false。

此時,正確的處理方式是在執(zhí)行線程的run()方法中捕獲到InterruptedException異常,并重新設置中斷標志位(也就是在捕獲InterruptedException異常的catch代碼塊中,重新調用當前線程的interrupt()方法)。

寫在最后

最后,附上并發(fā)編程需要掌握的核心技能知識圖,祝大家在學習并發(fā)編程時,少走彎路。

以上就是java高并發(fā)InterruptedException異常引發(fā)思考的詳細內容,更多關于java高并發(fā)InterruptedException異常的資料請關注腳本之家其它相關文章!

相關文章

  • Java編程實現A*算法完整代碼

    Java編程實現A*算法完整代碼

    這篇文章主要介紹了Java編程實現A*算法完整代碼,簡單介紹了a星算法,然后分享了完整測試代碼,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • Nacos注冊中心的幾種調用方式詳解

    Nacos注冊中心的幾種調用方式詳解

    Spring Cloud Alibaba Nacos 作為近幾年最熱門的注冊中心和配置中心,也被國內無數公司所使用,本文就來看下 Nacos 作為注冊中心時,調用它的接口有幾種方式
    2023-10-10
  • Java接口操作(繼承父類并實現多個接口)

    Java接口操作(繼承父類并實現多個接口)

    這篇文章主要介紹了Java接口操作(繼承父類并實現多個接口),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Spring中IOC和AOP的核心組成架構詳解

    Spring中IOC和AOP的核心組成架構詳解

    這篇文章主要介紹了Spring中IOC和AOP的核心組成架構詳解,本文是對Spring的2大核心功能——IoC和AOP 的總結提煉,并增加了環(huán)境profile和條件化bean的內容,篇幅較短,更像是一個大綱,或者思維導圖,需要的朋友可以參考下
    2023-08-08
  • SpringBoot項目使用jasypt加解密的方法

    SpringBoot項目使用jasypt加解密的方法

    jasypt是一個通用的加解密庫,我們可以使用它在配置文件中對數據庫密碼進行加密,以確保其安全性,接下來通過本文給大家介紹SpringBoot項目使用jasypt加解密的方法,感興趣的朋友一起看看吧
    2022-05-05
  • SpringBoot項目使用yml文件鏈接數據庫異常問題解決方案

    SpringBoot項目使用yml文件鏈接數據庫異常問題解決方案

    在使用SpringBoot時,利用yml進行數據庫連接配置需小心數據類型區(qū)分,如果用戶名或密碼是數字,必須用雙引號包裹以識別為字符串,避免連接錯誤,特殊字符密碼也應用引號包裹
    2024-10-10
  • maven多模塊工程打包部署的方法步驟

    maven多模塊工程打包部署的方法步驟

    本篇文章主要介紹了maven多模塊工程打包部署的方法步驟,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java Caledar類(日歷類)如何判斷本周周數

    Java Caledar類(日歷類)如何判斷本周周數

    這篇文章主要介紹了Java Caledar類(日歷類)如何判斷本周周數問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • java區(qū)分絕對路徑和相對路徑的方法

    java區(qū)分絕對路徑和相對路徑的方法

    這篇文章主要介紹了java區(qū)分絕對路徑和相對路徑的方法,實例分析了java針對路徑操作的相關技巧,需要的朋友可以參考下
    2015-04-04
  • RocketMQ源碼本地搭建調試方法

    RocketMQ源碼本地搭建調試方法

    這篇文章主要介紹了RocketMQ源碼本地搭建調試,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01

最新評論

南丰县| 舞阳县| 彩票| 新宾| 宁国市| 永昌县| 漠河县| 凤凰县| 仁化县| 东方市| 郯城县| 池州市| 登封市| 曲阜市| 乐至县| 卢氏县| 永和县| 明星| 大渡口区| 平乡县| 隆子县| 临颍县| 平罗县| 江油市| 阜南县| 贞丰县| 龙江县| 鲁甸县| 清徐县| 江津市| 神池县| 汕尾市| 三都| 西峡县| 剑川县| 绥中县| 修武县| 哈巴河县| 湖北省| 边坝县| 渭源县|