1. 程式人生 > >如何正確處理java interrupte

如何正確處理java interrupte

目前Java的執行緒類Thread關於中斷狀態的操作有三個方法,interrupte,interrupted,isInterrupted。

interrupte 方法:類例項方法,通過呼叫本地方法實現的給執行緒設定中斷狀態,只是給被呼叫執行緒設定中斷狀態,如果被呼叫執行緒正在執行的是可中斷方法,如Obejct.wait系列,join.系列,Thread.sleep系列,則會丟擲InterruptedException來響應中斷,並且會清理中斷狀態,如果之前true,只會後變false;

一開始會疑惑,為什麼被呼叫interrupte的執行緒會收到InterruptedException異常呢,還有既然interrupte只是設定標誌位,並不能馬上中止執行緒的執行,我們該怎麼樣正確使用interrupte以及正確處理InterruptedException呢。

java裡中斷一個執行緒,之前有強佔式的中斷如stop方法,官方已經不建議使用,一呼叫該方法,被stop的執行緒會馬上會釋放所有獲取的鎖並在執行緒的run()方法內,任何一點都有可能丟擲ThreadDeath Error,包括在catch或finally語句中,那麼很容易照成被同步的資料沒有被正確的處理完,那麼其它執行緒在讀取時就會得到髒資料。

所以現在jdk提供了協作式的中斷執行緒的方式,也就是,給執行緒設定一個標誌位,告訴它你是否被中斷了,至於何時或者如何處理這個中斷操作以及釋放鎖,由被呼叫執行緒自己處理。而interrupte方法就是協作式中斷執行緒的實現。通過呼叫執行緒的interrupte

方法設定中斷標誌為true,執行緒本身自己通過呼叫isInterrupted或者interrupted方法監測自身的中斷標記是否有true來做正確處理,區別就是isInterrupted返回執行緒中斷狀態時不會還原該狀態,而interrupted會清除掉中斷狀態,如果一個執行緒被中斷後你調兩次interrupted會得到不一樣得結果,第一次為true,第二次為false。jdk裡有些方法已經實現了怎麼響應這種協作式中斷方式,如Thread.sleep()在監測到自己已經被中斷後,會丟擲InterruptedException來結束自己餘下業務程式碼的工作。那麼我們在該如何正確編寫響應中斷的處理,或者正確中斷其它執行緒呢。

1、如何你定義的方法式支援響應中斷的,則在方法定義裡宣告會丟擲InterruptedException

2、在業務處理核心位置通過呼叫isInterrupted或者interrupted監測當前執行緒是否被設定了中斷標記,具體呼叫哪一個方法,取決於是否希望其它線看到你的被中斷狀態,如果監測到當前執行緒被中斷,則往外丟擲InterruptedException,讓呼叫者正確處理中斷。

3、在捕獲到呼叫方法丟擲的InterruptedException異常時,如果自己不知道該怎麼處理的,就繼續往外拋,如果時在自己的業務處理範圍內的,就處理該異常,然後通過呼叫interrupte方法讓自己標記位設定位中斷狀態,因為之前丟擲InterruptedException時中斷標記位會被清除,所以需要重新設定中斷來響應其它執行緒的中斷操作,然後返回到上一層呼叫,讓其它呼叫者自己處理。

相關推薦

如何正確處理java interrupte

目前Java的執行緒類Thread關於中斷狀態的操作有三個方法,interrupte,interrupted,isInterrupted。 interrupte 方法:類例項方法,通過呼叫本地方法實現的給執行緒設定中斷狀態,只是給被呼叫執行緒設定中斷狀態,如果被呼叫執行

Java中斷異常 InterruptedException 的正確處理方式

你看到這篇檔案可能是因為你已經呼叫了一個丟擲 InterruptedException 異常的方法,並且需要以某種方式處理它。 首先,需要了解為一個方法為啥會 throws InterruptedException, 是這個方法丟擲中斷異常作為方法簽名的一部分以及呼叫正在呼叫的方法的可能結果。因此,首先

Java正確處理InterruptedException的方法

要想討論正確處理InterrupedtException的方法,就要知道InterruptedException是什麼。 根據Java Doc的定義Thrown when a thread is waiting, sleeping, or otherwise occupie

最全面的Java字節byte操作,處理Java基本數據的轉換及進制轉換操作工具,流媒體及java底層開發項目常用工具類

進制 string 常用工具類 cat i++ logs 指定位置 tput off 前言:用於處理Java基本數據的轉換及進制轉換操作工具 一、實現功能 1、int預byte互轉 2、int與byte[]互轉 3、short與byte互轉 4、short與byte[]互轉

算法筆記_221:串的簡單處理(Java)

bsp 串的簡單處理 它的 public 劃線 ati href block 規則 目錄 1 問題描述 2 解決方案 1 問題描述 串的處理在實際的開發工作中,對字符串的處理是最常見的編程任務。本題目即是要求程序對用戶輸入的串進行處理。具體規則如下:1. 把每個單

POI以SAX方式解析Excel2007大文件(包含空單元格的處理) Java生成CSV文件實例詳解

arraylist api csdn false gif pac apache all top http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyl

Myeclipse - Web項目轉換技巧--處理Java項目、SVN非Web項目問題

問題 ava 最簡 路徑 編輯器 臨時 str ssp view 喜歡從業的專註,七分學習的態度。 概述 對於Java調試,使用Eclipse習慣性的使用Junit調試,使用Myeclipse習慣性的將項目轉成Web項目在Tomcat或Weblogic中調試,在My

正確處理下載文件時HTTP頭的編碼問題(Content-Disposition)

robot shel 回歸 發布 合並 市場 ots 例子 int 轉自:https://blog.robotshell.org/2012/deal-with-http-header-encoding-for-file-download/ 最近在做項目時遇到了一個 case

bootstrap模態框遠程加載網頁的正確處理方式

clas 處理 加載網頁 logs def lose 刷新 客戶端 粘貼 bootstrap模態框遠程加載網頁的方法 在bootsrap模態框文檔裏給出了這個方法: 使用鏈接模式 <a data-toggle="modal" href="tieniu.php

如何正確實現 Java 中的 HashCode

讓我 instance 根據 person 哈希算法 失敗 提高 一起 結果 原文出處: 開源中國 相等 和 Hash Code 從一般角度來看,Equality 是不錯的,但是 hash code 更則具技巧性。如果我們在 hash code上多下點功夫,我們就能了解

正確Java學習線路圖原來是這樣,教你如何成為優秀的程序員

java se 簡單的 server oracl 數據庫三範式 jdb serve asc uno IT行業現在正處於火熱的階段,很多人面對就業這個難題迷惘之後選擇了程序員的道路,java作為其中一個大的板塊受到了很多學員的青睞,那麽如何正確的學習java呢?千鋒長沙的老師

005 異常處理 java基礎學習總結——異常處理

 java基礎學習總結——異常處理 一、異常的概念   異常指的是執行期出現的錯誤,也就是當程式開始執行以後執行期出現的錯誤。出現錯誤時觀察錯誤的名字和行號最為重要。    1 package cn.javastudy.summary; 2 3 p

把握人性的弱點——正確處理人際關係

正確處理人際關係 1,不要批評,指責或者抱怨 標記: 我們所要糾正和指責的人總是會為他們作自我辯護,並反過來指責我們。或者只是他們不知道:“我不知道怎麼做才能和以前不同”。 不議論別人,別人才不會議論你。 不要批評他們,如果我們跟他們在同樣的情況下,也會跟他們一樣的。——林肯

異常處理——java基礎

Evernote Export body,td { font-family: 微軟雅黑; font-size: 10pt } 異常處理     異常處理的套路模板: try//

有關JVM處理Java陣列方法的思考

在Java中,獲取陣列的長度和String的長度是兩種不同的方法,這引起了本文作者的一番思考。本文從JVM的角度,探討了Java陣列在JVM中是什麼物件,有哪些成員,以及宣告方法。 本文來自jarfield的部落格,原文標題為《為什麼如此獲取Java陣列的長度》。 記得vamcily 曾問我

JEECG&JWT異常捕獲強化處理 | Java: Meaning of catch (final SomeException e)?

//從header中得到token String authHeader = request.getHeader(JwtConstants.AUTHORIZATION); if (authHeader == null) { th

異常處理java.lang.RuntimeException: No buckets?? seems there is no data to index.

2018-09-16T15:10:53,695 ERROR [task-runner-0-priority-0] io.druid.indexing.overlord.ThreadPoolTaskRunner - Exception while running task[Ha

異常處理 java

Throwable是一個怎樣的類? 答:Throwable是java.lang包中一個專門用來處理異常的類。它有兩個子類,即Error 和Exception,它們分別用來處理兩組異常。 Error用來處理程式執行環境方面的異常,比如,虛擬機器錯誤、裝載錯誤和連線錯誤,這類異

正確處理iOS從下方滑出滾動檢視

在iOS 11開始,從最早的地圖應用到最近的捷徑,陸續有系統應用使用從下方滑出列表的形式,這種系統提供的圓角風格檢視用手勢劃出和隱藏時非常自然流暢。國內的一些應用也跟進了這種互動方式,但是我發現很大一部分APP都沒有正確的處理ScrollView滾動和檢視滾動的銜接,以至於相比於系統應用不夠自然。比如知乎的

處理java.lang.NoClassDefFoundError錯誤

一般出現出現jar包缺失,或者版本不對,都會提示ClassNotFoundException。這次出現這個發先還是jar包丟失,啟動springcloud專案的時候發現Caused by: java.lang.NoClassDefFoundError: Could not i