簡單聊聊java 中斷機制

2021-08-14 14:54:09 字數 1813 閱讀 2305

首先,乙個執行緒不應該由其他執行緒來強制中斷或停止,而是應該由執行緒自己自行停止。

所以,thread.stop, thread.suspend, thread.resume 都已經被廢棄了。

而 thread.interrupt 的作用其實也不是中斷執行緒,而是「通知執行緒應該中斷了」,

具體到底中斷還是繼續執行,應該由被通知的執行緒自己處理。

具體來說,當對乙個執行緒,呼叫 interrupt() 時,

① 如果執行緒處於被阻塞狀態(例如處於sleep, wait, join 等狀態),那麼執行緒將立即退出被阻塞狀態,並丟擲乙個interruptedexception異常,清楚中斷標記。

② 如果執行緒處於正常活動狀態,那麼會將該執行緒的中斷標誌設定為 true,僅此而已。被設定中斷標誌的執行緒將繼續正常執行,不受影響。

interrupt() 並不能真正的中斷執行緒,需要被呼叫的執行緒自己進行配合才行。

也就是說,乙個執行緒如果有被中斷的需求,那麼就可以這樣做。

① 在正常執行任務時,經常檢查本執行緒的中斷標誌位,如果被設定了中斷標誌就自行停止執行緒。

② 在呼叫阻塞方法時正確處理interruptedexception異常。(例如,catch異常後就結束執行緒。)

thread thread = new thread(() -> 

});thread.start();

// 一段時間以後

thread.interrupt();

具體到你的問題,thread.interrupted()清除標誌位是為了下次繼續檢測標誌位。

如果乙個執行緒被設定中斷標誌後,選擇結束執行緒那麼自然不存在下次的問題,

而如果乙個執行緒被設定中斷標識後,進行了一些處理後選擇繼續進行任務,

而且這個任務也是需要被中斷的,那麼當然需要清除標誌位了。

舉個例子

public classprimegenerator 

extendsthread

if(isinterrupted())

try

catch(interruptedexception e)

number++;}}

private booleanisprime(

intnumber)

}return true;

}}

public classmain

catch(interruptedexception e)

thread.interrupt();

trycatch(interruptedexception e)

system.out.println(thread.getstate());

}}

上圖為乙個生成質數的程式和乙個客戶端程式,質數執行緒啟動五秒後,使用thread.interrupt()方法,
1 當執行緒正常執行時,這時我們用isinterrupted()方法判斷中斷標記,如果為true,則使用return退出執行緒。
2 如果執行緒為sleep狀態,則會丟擲異常,我們捕捉這個異常然後使用return退出執行緒。

Linux中斷機制

中斷 interrupt 被定義為乙個事件,該事件改變處理器執行的指令順序,這樣的事件與cpu晶元內外部硬體電路產生的電訊號相對應。中斷通常分為同步 synchronous 中斷和非同步 asynchronous 中斷。同步中斷指的是當指令執行時由cpu控制單元產生的,之所以稱為同步,是因為只有在一...

簡單聊聊8583

網上應該有不少關於8583的文章,這個算是屬於老生常談了,但是要找一篇細緻的,容易理解的可能還真不太好找,那我們今天就來簡單的聊聊。這個其實銀聯給的文件上已經很全了,我們再複習下 m 強制域 mandatory 此域在該訊息中必須出現否則將被認為訊息格式出錯。c 條件域 conditional 此域...

簡單聊聊HUGEPAGE

可能很多朋友都了解在大記憶體的伺服器上使用hugepage有助於提公升應用的效能?不過為什麼會這樣呢?是不是使用hugepage就一定對應用的效能有幫助呢?linux的transparent hugepages功能是不是對我們有幫助呢?如果要回答這些問題,我們必須了解hugepage是什麼,可能很多...