2014-09-22 30 views
2

Thread.stop()的Java文檔使得它聽起來像世界將結束,如果你曾經調用Thread.stop()。何時可以在Java中使用Thead.stop()?

已棄用。這種方法本質上是不安全的。使用 停止線程Thread.stop會導致它解除鎖定的所有監視器 (作爲未檢查的ThreadDeath異常 傳播堆棧的自然結果)。如果這些監視器先前受保護的對象 處於不一致狀態,則損壞的對象 對其他線程可見,可能導致任意的 行爲。停止的許多用途應該被代碼所取代,代碼只需 修改某些變量以指示目標線程應停止 運行。目標線程應定期檢查此變量,如果變量 指示它將停止運行,則 將按順序從其運行方法返回。如果目標線程長時間等待 (例如,在條件變量上),則應該使用中斷 方法來中斷等待。有關更多信息,請參閱 爲什麼Thread.stop,Thread.suspend和Thread.resume已過時?

例如,如果我在第三方運行一個方法,封閉源代碼庫,並且我需要保證它在5分鐘或更短時間內結束,那麼還有其他方法嗎?使用Thread.stop()的真實世界的後果是什麼?我怎樣才能確定它們是否發生?

+1

其中一個後果是可能會從將來的版本中刪除不推薦使用的方法,從而導致您的代碼無法編譯/無法運行。 – 2014-09-22 22:09:51

+7

簡短回答:從不。 – 2014-09-22 22:10:38

+0

查找thread.interupt。這是取代停止的方法。 – TheBat 2014-09-22 22:12:32

回答

4

從來沒有!

在任何情況下,您都不可使用Thread.stop()

如果您認爲您需要撥打Thread.stop()不要!這將是錯誤的。

Thread.stop()不應在任何情況下調用。

請不要致電Thread.stop() - 即使您正在受到死亡的威脅。

我將此答案捐給community wiki請 - 其他人 - 與我一起通過編輯這個答案並添加您的禱告,請求不要致電Thread.stop(),請求我譴責Thread.stop()的罪名。

如果你真的想要一個進程在5分鐘後死亡 - 使用Process可以是destroyed。這將保護主JVM免受使用Thread.stop()終止線程時可能發生的任何潛在損壞。但是,如果孩子Process位於I/O中間,則可能會使文件處於損壞狀態。防禦這種情況的一種方法是使數據庫的客戶端可以回滾正在進行的事務。

一般來說,安全非常非常困難地終止不合作的事情

+2

困難,但並非不可能。 OS如Z/OS做到了。諸如CICS之類的事務監視器執行此操作。諸如DB/2的DBMS系統可以做到這一點。在所有情況下,因爲這些系統的管理員都需要殺死失控進程的功能。 – 2014-12-03 12:13:46

相關問題