[英]Thread Interrupt in java
我有以下問題,如果我在java中斷一個線程,一個運行15分鍾的進程,它將停止進程,停止方法或將完成此進程,並且不允許其他人繼續排隊?
我有一個“線程”,它將調用一個方法,它將在postgres中插入后進行基於“訪問”和“postgres”的比較,如果我想停止調用此操作的線程,她將成功停止進程,還是等他們完成?
除非在其中執行的方法在接收到“中斷”信號時願意終止,否則它不會停止該線程。 拋出InterruptedException的方法通常屬於此類別。 當然,調用鏈中的所有方法都需要以某種方式進行合作。
如果你的代碼沒有調用“可中斷”的方法或者沒有長時間調用它們的部分,那么請定期檢查標志Thread.isInterrupted()
,如果它變為true
,則終止干凈和優雅。 同樣的事情,如果你曾經收到(和捕獲,你應該) InterruptedException
s。
但是,如果您的意圖更具體,那么您的問題可以得到改善。 我正要解釋“線程中斷”協議是如何工作的,但也許這不是你想要的。
當你“中斷”一個線程時,它會做三件事之一(這可能是幕后的事情):
InterruptedException
。 InterruptibleChannel
實現的操作),則拋出ClosedByInterruptException
。 Thread.interrupted()
(它將立即重置標志)來檢查該標志......但如果沒有,則下一次調用any_object.wait()
, Thread.sleep()
或any_thread.join()
, 或許某些其他阻塞方法,將拋出異常。 當然,所有這些異常都是經過檢查的異常...這幾乎總是意味着附近會有一個異常處理程序(除非代碼被設計為可中斷,否則通常只會忽略異常並再次嘗試操作)。 如果線程永遠不會等待,並且永遠不會檢查中斷標志,那么中斷它就不會有太大作用。
此外,如果線程當前正在等待JVM控制之外的某些內容,則中斷可能沒有任何效果。 在某些平台上(Windows可以想到),Java很難中斷本機代碼。
所有這些警告可以概括為:如果你想要的是殺死一個不守規矩的線程,這可能不是這樣做的方式。 事實是,沒有一種可靠的方法來殺死一個線程,而不會讓你的進程處於一個潛在的古怪狀態。 在這種情況下,您通常需要的是一個單獨的過程,如果它失控,您可以殺死它。
來自消息來源 : -
中斷是一個線程的指示,它應該停止正在做的事情並做其他事情。 由程序員決定線程如何響應中斷,但線程終止是很常見的。 這是本課程中強調的用法。 線程通過調用Thread對象上的中斷來發送中斷,以便線程被中斷。 為使中斷機制正常工作,被中斷的線程必須支持自己的中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.