我需要使用不推薦的stop(),因爲我需要運行由其他程序員開發的Runnable類,並且我不能在方法運行時使用while(isRunning == true)。如果我真的需要它,我可以在Java中使用thread.stop()嗎?
問題是:使用方法stop()足夠安全嗎? Theads不使用任何資源(如文件,數據庫或Internet連接)。但是我想確定在用stop()方法停止十幾個線程後,JVM不會被破壞。
P.S:是的,我可以寫一些代碼來測試它,但我希望有人知道答案)
我需要使用不推薦的stop(),因爲我需要運行由其他程序員開發的Runnable類,並且我不能在方法運行時使用while(isRunning == true)。如果我真的需要它,我可以在Java中使用thread.stop()嗎?
問題是:使用方法stop()足夠安全嗎? Theads不使用任何資源(如文件,數據庫或Internet連接)。但是我想確定在用stop()方法停止十幾個線程後,JVM不會被破壞。
P.S:是的,我可以寫一些代碼來測試它,但我希望有人知道答案)
排序的。關於Thread.stop()
沒有什麼內在的「腐敗」。問題在於,當執行它們的線程突然停止時,它可能會使對象處於損壞狀態。如果程序的其餘部分對這些對象沒有可見性,那麼它是正常的。另一方面,如果其中一些對象對程序的其餘部分可見,則可能會遇到難以診斷的問題。
JVM不會損壞,但請仔細閱讀javadoc以確保您不符合他們的「災難」條件。
你需要仔細看看線程所在的任何同步監視器。你提到的文件和套接字是掛在資源上的,但你還需要考慮任何共享的數據結構。還要確保您的異常處理不會捕獲RuntimeException
s(請參閱stop())。
如果您使用Thread.stop
,假設您的用戶很少,那麼您可能會逃脫。這是特別難以測試。它在執行代碼的任何地方都會導致異常。您無法測試所有可能的情況。在你的機器上,你可能永遠不會發現問題;來下一個JRE更新你的程序可能會以一個非常模糊的間歇性錯誤開始失敗。
示例問題是如果線程正在加載一個類。該課程未能加載並且不會再次重試。你的程序壞了。
我在我的問題"Are thread stop and friends ever safe?"中解決了這個問題,在其中一個答案中,我試圖找出使stop()
安全使用的前提條件。但這仍然是一項「正在進行中的工作」。
順便說一句:編寫測試代碼不一定有幫助。 (測試只證明了錯誤的存在,而不是沒有錯誤。)你會更好地嘗試推理這個問題,IMO。但這並不容易:-)。
如果對象將是「邏輯」,但不是demaged phisically話我就不在此情況下關心)) – Roman 2009-09-02 21:25:38