2011-03-09 101 views
6

我想立即停止Java線程,但是當我嘗試線程停止之前總是需要一些時間。 有沒有一種強制Java線程立即停止的好方法?有沒有一種強制停止Java線程的好方法?

+0

取決於要求。那麼,你可以立即停止使用中斷() –

+0

@Mohamed Saligh:我使用相同的。但花時間停止線程。我可以在我的服務器控制檯上看到該進程。 –

+0

請在下面尋找答案.. –

回答

3

運行線程無法使用Thread.Interrupt停止,只能使用Thread.Interrupt停止等待或阻塞線程。但使用共享變量來表示它應該停止正在執行的操作。線程應定期檢查變量(例如:使用while循環)並按順序退出。

private boolean isExit= false; 

public void beforeExit() { 
    isExit= true; 
} 

public void run() { 
    while (!isExit) { 

    } 
} 
12

沒有什麼好的方法來立即停止線程。

  • Thread.stop(),但它是危險的,不推薦使用。不要使用它,除非:

    1. 你完全明白的問題,

    2. 你有徹底分析你的代碼,並確定該問題不適用和/或風險是可以接受的。

  • Thread.interrupt(),但不保證線程會迅速停止,甚至都停止。

  • 有寫入線程定期檢查標誌的方法,但是如果標誌沒有經常檢查(意外或通過設計),則線程不會很快停止。


FWIW,標誌和interrupt()方法在本質上是相同的。在這兩種情況下,期望中斷的線程都需要定期檢查;例如通過調用interrupted()isInterrupted()或通過檢查一個標誌。區別在於interrupt()機制將在代碼正在等待notify()或阻塞和IO操作時起作用。因此,並且因爲interrupt是一種獨立於應用程序的方式,所以應優先使用它,而不是應用程序特定的機制。

+0

此外,如果您想使用使用Java基礎結構的標誌方法,則可以使用'Thread.currentThread.isInterrupted'。 – sixtyfootersdude

+0

@sixtyfootersdude - 我相信我已經說過了。 –

1

不要在任何情況下使用Thread.stop - 如果你問這個問題,那麼你不明白Java線程模型足以安全地使用它。

的細節,爲好奇,在這裏:http://download.java.net/jdk7/archive/b131/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

如果你在Java併發真的夠好,那麼你就會明白爲什麼你不應該使用它,即使它的內完全安全的自己的代碼,它會讓你的代碼被其他人污染和無法使用。相反,您最終可能會使用布爾變量技巧或某種其他模式來告訴線程何時完成並退出。

不要使用Thread.stop。永遠。

+0

我幾乎允許我在鏈接上使用Thread.stop()thx! –

4

有一個好辦法安全(和快速)強行停止一個線程:

System.exit(0) 

不幸的是,這種具有殺滅所有其他線程的副作用

+17

拉出電源線也是如此:-) –

+0

雖然我不會在數據中心建議這樣做:-) –

+1

這是一個不好的答案,它會殺死我所有的線程! – HDJEMAI

相關問題