2013-08-23 101 views
3

我有以下問題,如果我中斷了java中的一個線程,這是一個運行15分鐘的進程,它會停止進程,停止方法或將完成此過程,並且不允許其他人繼續線?Java中的線程中斷

我有一個「線程」,它會調用一個方法,它會在postgres中插入後執行基於「access」和「postgres」的比較,如果我想停止調用此操作的線程,她會成功停止過程,還是等待他們完成?

+2

你能提供一些示例代碼嗎?這將有助於理解你的問題。 –

+0

搜索「java線程中斷」什麼都不起來? (當然,[技巧問題](http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html))。 – millimoose

+0

此外,還有一個問題是你無法打斷阻止的方法一個套接字讀取。 (除非它使用的是NIO,而數據庫驅動程序可能不是。)您必須關閉套接字才能解除阻塞。 – millimoose

回答

3

它不會停止線程,除非在其中執行的方法在接收到「中斷」信號時願意終止。拋出InterruptedException的方法通常屬於這個類別。當然,呼叫鏈中的所有方法都需要以這種或那種方式進行合作。

如果你的代碼不叫「可中斷」的方法或有不叫他們長時間段,然後讓他們定期檢查標誌Thread.isInterrupted(),並終止乾淨,優雅的,如果它真的成爲true。同樣的事情,如果你收到(和趕上,你應該)InterruptedException s。

但是,如果您的意圖更具體,您的問題可以改進。我正要解釋「線程中斷」協議是如何工作的,但也許這不是你要找的。

+0

我認爲唯一的解決方案將驗證你在線程中的情況,所以我可以停止這些進程。 – Giovane

+0

除非線程處於引發InterruptedException的阻塞方法中,否則指示中斷執行nohing是不正確的。中斷設置線程中的中斷標誌。某些阻塞方法可能會通過拋出InterruptedException而提早退出。 – bowmore

+0

@bowmore我的短語(或者我想要的)是「它不會做任何**你所提到的**」 –

2

source: -

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

+0

太糟糕了,我不能殺死線程。 – Giovane

+0

@Giovane你可以但不應該,因爲它神只知道它的內部狀態和未完成的操作。 – millimoose

+0

我只是希望它停止,並避免用戶進行不必要的處理。 – Giovane

3

當「中斷」一個線程,但它的三件事(這很可能是幕後同樣的事情)之一:

  • 如果線程正在等待,睡覺,或加入另一個線程,該中斷將導致InterruptedException被引發到目標線程中。
  • 如果線程被阻塞等待「可中斷I/O」(即對InterruptibleChannel執行的操作),則會拋出ClosedByInterruptException
  • 如果它沒有做這些事情之一,那麼會在線程上設置一個標誌。線程可以通過調用Thread.interrupted()(它會立即重置該標誌)來檢查該標誌......但是如果不是,則下一個調用any_object.wait(),Thread.sleep()any_thread.join()或許某些其他阻塞方法將會拋出一個例外。

所有這些例外,當然都是檢查例外......這幾乎總是意味着會有附近(其中,除非該代碼被設計爲可中斷,通常會忽略的異常處理程序異常並再次嘗試操作)。如果線程從不等待,並且從不檢查中斷標誌,那麼中斷它不會有太大的作用。另外,如果線程當前正在等待JVM控制之外的某個內容,則該中斷可能沒有任何作用。在某些平臺上(Windows想起來),Java很難中斷本地代碼。

所有這些注意事項可以總結爲:如果你想要殺死一個不守規矩的線程,這可能不是一個辦法。事實是,沒有一種體面的方式可以在不使您的進程處於潛在古怪狀態的情況下殺死線程。在這種情況下,你通常想要的是一個單獨的過程,如果它失控,你可以殺死它。