簡體   English   中英

java中的線程中斷

[英]Thread Interrupt in java

我有以下問題,如果我在java中斷一個線程,一個運行15分鍾的進程,它將停止進程,停止方法或將完成此進程,並且不允許其他人繼續排隊?

我有一個“線程”,它將調用一個方法,它將在postgres中插入后進行基於“訪問”和“postgres”的比較,如果我想停止調用此操作的線程,她將成功停止進程,還是等他們完成?

除非在其中執行的方法在接收到“中斷”信號時願意終止,否則它不會停止該線程。 拋出InterruptedException的方法通常屬於此類別。 當然,調用鏈中的所有方法都需要以某種方式進行合作。

如果你的代碼沒有調用“可中斷”的方法或者沒有長時間調用它們的部分,那么請定期檢查標志Thread.isInterrupted() ,如果它變為true ,則終止干凈和優雅。 同樣的事情,如果你曾經收到(和捕獲,你應該) InterruptedException s。

但是,如果您的意圖更具體,那么您的問題可以得到改善。 我正要解釋“線程中斷”協議是如何工作的,但也許這不是你想要的。

當你“中斷”一個線程時,它會做三件事之一(這可能是幕后的事情):

  • 如果線程當前正在等待,休眠或加入另一個線程,則該中斷將導致在目標線程中拋出InterruptedException
  • 如果線程被阻塞等待“可中斷I / O”(即對InterruptibleChannel實現的操作),則拋出ClosedByInterruptException
  • 如果它沒有執行其中一項操作,則會在該線程上設置一個標志。 線程可以通過調用Thread.interrupted() (它將立即重置標志)來檢查該標志......但如果沒有,則下一次調用any_object.wait()Thread.sleep()any_thread.join()或許某些其他阻塞方法,將拋出異常。

當然,所有這些異常都是經過檢查的異常...這幾乎總是意味着附近會有一個異常處理程序(除非代碼被設計為可中斷,否則通常只會忽略異常並再次嘗試操作)。 如果線程永遠不會等待,並且永遠不會檢查中斷標志,那么中斷它就不會有太大作用。

此外,如果線程當前正在等待JVM控制之外的某些內容,則中斷可能沒有任何效果。 在某些平台上(Windows可以想到),Java很難中斷本機代碼。

所有這些警告可以概括為:如果你想要的是殺死一個不守規矩的線程,這可能不是這樣做的方式。 事實是,沒有一種可靠的方法來殺死一個線程,而不會讓你的進程處於一個潛在的古怪狀態。 在這種情況下,您通常需要的是一個單獨的過程,如果它失控,您可以殺死它。

來自消息來源 : -

中斷是一個線程的指示,它應該停止正在做的事情並做其他事情。 由程序員決定線程如何響應中斷,但線程終止是很常見的。 這是本課程中強調的用法。 線程通過調用Thread對象上的中斷來發送中斷,以便線程被中斷。 為使中斷機制正常工作,被中斷的線程必須支持自己的中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM