欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 中的線程中斷應(yīng)用場景詳解

 更新時間:2025年09月22日 11:11:06   作者:Cloud-Future  
本篇文章將詳細(xì)介紹什么是線程中斷、如何觸發(fā)線程中斷、如何處理線程中斷、線程中斷與線程終止的區(qū)別以及線程中斷的應(yīng)用場景,感興趣的朋友跟隨小編一起看看吧

1、什么是線程中斷

Java線程中斷是一種線程間協(xié)作機制,用于通知線程應(yīng)在合適的時候停止當(dāng)前任務(wù)。中斷并非強制終止線程,而是通過設(shè)置線程的中斷標(biāo)志位,由線程自身檢查并決定如何處理。

2、如何觸發(fā)線程中斷

  • 使用 Thread.interrupt() 方法
    • 該方法向目標(biāo)線程發(fā)送中斷信號,設(shè)置其中斷標(biāo)志位為true。若線程處于阻塞狀態(tài)(如wait()、sleep()),會拋出InterruptedException并清除中斷標(biāo)志。
    • 如果任務(wù)通過線程池submit()方法提交到線程池中執(zhí)行,可使用 Future.cancal(true) 發(fā)送中斷信號
  • Future.cancal(true) 會獲取到 阻塞在 Future.get() 的線程實例,然后調(diào)用 thread.interrupt() 方法。

3、如何處理線程中斷

3.1 線程中斷相關(guān)的核心方法

  • interrupt()
    • 向目標(biāo)線程發(fā)送中斷信號,設(shè)置其中斷標(biāo)志位為true。若線程處于阻塞狀態(tài)(如wait()、sleep()),會拋出InterruptedException并清除中斷標(biāo)志。
  • isInterrupted()
    • 檢查線程的中斷標(biāo)志位狀態(tài),不會清除標(biāo)志位。
  • Thread.interrupted()
    • 靜態(tài)方法,檢查當(dāng)前線程的中斷狀態(tài)并清除標(biāo)志位(即重置為false)。

3.2 處理中斷的典型方式

響應(yīng)中斷的阻塞操作
當(dāng)線程調(diào)用如sleep()、wait()等方法時,需捕獲InterruptedException并恢復(fù)中斷狀態(tài)(避免吞沒中斷信號),因為 InterruptedException 會清除中斷狀態(tài):

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    Thread.currentThread().interrupt(); // 重新設(shè)置中斷標(biāo)志
    // 執(zhí)行清理或退出邏輯
}

主動檢查中斷狀態(tài)
通過循環(huán)中檢查isInterrupted()實現(xiàn)協(xié)作式終止:

while (!Thread.currentThread().isInterrupted()) {
    // 執(zhí)行任務(wù)邏輯
}

3.3 注意事項

  • 不可逆性:拋出InterruptedException后中斷標(biāo)志會被清除,需手動恢復(fù)。
  • 非強制終止:線程可以忽略中斷,但通常不推薦。
  • 資源清理:應(yīng)在中斷處理中釋放資源(如關(guān)閉文件、網(wǎng)絡(luò)連接)。

4、線程中斷與線程終止的區(qū)別

  • 線程中斷:是線程間協(xié)作機制,不強制終止線程的執(zhí)行,依賴線程自身響應(yīng)。
  • 強制終止(已廢棄的stop()):直接終止線程,可能導(dǎo)致資源未釋放或數(shù)據(jù)不一致,不推薦使用。

5、線程中斷的應(yīng)用場景

5.1 長時間運行任務(wù)的取消

當(dāng)線程執(zhí)行耗時操作(如I/O阻塞、復(fù)雜計算)時,外部可通過中斷信號請求終止任務(wù)。例如:

Thread worker = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) { // 當(dāng)收到中斷信號時退出循環(huán)
        // 執(zhí)行任務(wù)邏輯
    }
});
worker.start();
worker.interrupt(); // 發(fā)起中斷請求

5.2 阻塞操作的快速響應(yīng)

線程在Object.wait()、Thread.sleep()、或BlockingQueue.take()等阻塞方法時,調(diào)用interrupt()會拋出InterruptedException,立即終止等待狀態(tài):

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    Thread.currentThread().interrupt(); // 恢復(fù)中斷狀態(tài)
    // 清理資源
}

5.3 服務(wù)或線程池的優(yōu)雅關(guān)閉

線程池通過中斷所有工作線程實現(xiàn)關(guān)閉。ExecutorService.shutdownNow()內(nèi)部會遍歷線程并調(diào)用interrupt(),任務(wù)需檢查中斷狀態(tài)主動退出。

5.4 超時控制

結(jié)合Future.cancel(true),可中斷正在執(zhí)行的異步任務(wù)。若任務(wù)未響應(yīng)中斷,超時后仍可能繼續(xù)占用資源。

5.5 事件驅(qū)動架構(gòu)

在生產(chǎn)者-消費者模型中,中斷可用于緊急停止消費者線程。例如當(dāng)系統(tǒng)內(nèi)存不足時,中斷日志寫入線程避免OOM。

6 線程中斷的常見問題

為什么發(fā)送線程中斷后我的線程還在執(zhí)行?
調(diào)用 interrupt 只是在線程中設(shè)置一個標(biāo)記,并不會強制終止線程。如果線程執(zhí)行的代碼邏輯中沒有 Thread.currentThread().isInterrupted()Thread.interrupted() 的檢測邏輯和退出語句則線程執(zhí)行不會受到任何影響。

為什么我無法檢測到線程中斷?
需要注意 拋出的 InterruptedException 異常和調(diào)用 Thread.interrupted() 會清除中斷狀態(tài),之后判斷線程的中斷狀態(tài)則是 false。正確的做法是使用 Thread.currentThread().interrupt(); 重新設(shè)置中斷狀態(tài),后續(xù)邏輯才能繼續(xù)判斷是否中斷。

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

相關(guān)文章

  • 在SpringMVC框架下實現(xiàn)文件的上傳和下載示例

    在SpringMVC框架下實現(xiàn)文件的上傳和下載示例

    本篇文章主要介紹了在SpringMVC框架下實現(xiàn)文件的上傳和下載示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • SpringBoot中DataSource配置失敗問題的解決方法

    SpringBoot中DataSource配置失敗問題的解決方法

    在SpringBoot項目里,當(dāng)嘗試啟動應(yīng)用程序時,有時會遇到Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured錯誤, 本文記錄了如何解決Spring Boot中DataSource配置失敗問題,需要的朋友可以參考下
    2025-06-06
  • 多層嵌套的json的值如何解析/替換

    多層嵌套的json的值如何解析/替換

    這篇文章主要介紹了多層嵌套的json的值如何解析/替換的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Java8深入學(xué)習(xí)之熟透Optional

    Java8深入學(xué)習(xí)之熟透Optional

    這篇文章主要給大家介紹了關(guān)于Java8深入學(xué)習(xí)之熟透Optional的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • SpringBoot監(jiān)聽Redis key失效事件的實現(xiàn)代碼

    SpringBoot監(jiān)聽Redis key失效事件的實現(xiàn)代碼

    這篇文章給大家介紹了SpringBoot實現(xiàn)監(jiān)聽Redis key失效事件的方法,文中通過代碼示例給大家講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2024-02-02
  • Spring JPA 增加字段執(zhí)行異常問題及解決

    Spring JPA 增加字段執(zhí)行異常問題及解決

    這篇文章主要介紹了Spring JPA 增加字段執(zhí)行異常問題及解決,具有很好的參考價值,
    2022-06-06
  • ElasticSearch如何設(shè)置某個字段不分詞淺析

    ElasticSearch如何設(shè)置某個字段不分詞淺析

    最近在學(xué)習(xí)ElasticSearch官方文檔過程中發(fā)現(xiàn)的某個問題,記錄一下 希望能幫助到后面的朋友,下面這篇文章主要給大家介紹了關(guān)于ElasticSearch如何設(shè)置某個字段不分詞的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Java檢測死鎖案例

    Java檢測死鎖案例

    這篇文章主要介紹了Java檢測死鎖案例,本文列舉了導(dǎo)致死鎖的程序,通過使用jconsole工具進行檢測等,講述了避免死鎖的方法,需要的朋友可以參考下
    2021-07-07
  • MyBatis OGNL 表達式的避坑指南

    MyBatis OGNL 表達式的避坑指南

    本文主要介紹了MyBatis OGNL 表達式的避坑指南,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • Spring IOC推導(dǎo)與DI構(gòu)造器注入超詳細(xì)講解

    Spring IOC推導(dǎo)與DI構(gòu)造器注入超詳細(xì)講解

    這篇文章主要介紹了Spring IOC推導(dǎo)與DI構(gòu)造器注入,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02

最新評論