2009-07-09 191 views
2

是否可以在不引發異常的情況下終止Java線程?在Java中立即終止線程

這只是爲了測試目的 - 我想模擬整個計算機中途死亡的情況。

注 - 我看到一個不贊成的Thread.destroy()方法,但文檔說它從來沒有得到實施的第一個地方。

+0

在窗口上,使用Process Explorer殺死進程內的線程。 – akarnokd 2009-07-10 07:50:44

回答

6

不是。有一些不推薦使用的'固有不安全'的方法,但正如它的註釋強調的那樣,事情可能會處於深度破壞狀態,並且ThreadDeath錯誤仍然在線程內部拋出。

stop()的問題,它似乎工作後可表現長,Sun公司的解釋是:

http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

會不會殺JVM進程(或者唬弄插件)是一個更好的模擬電腦死亡?

0

您的測試的要點是什麼? Java不提供關於退出時會發生什麼的保證,除了嘗試在退出是「乾淨」的情況下運行關機鉤

這聽起來類似於試圖在程序的行爲中測試程序的行爲OutOfMemory;有沒有什麼可以做的事情,也沒有辦法確定將會發生什麼事

+0

重點是檢查事務處理。如果計算機在線程中途死亡,事務就會回滾,而另一臺計算機(=服務)最終應該在事務中提取作業。 – ripper234 2009-07-09 06:23:17

+0

你有寫過交易層嗎?或者你是否在使用他人的 – 2009-07-09 06:24:12

0

是否有任何理由不能使用Thread.suspend()?它會停止線程,以便在線程中斷時檢查狀態。

你也可以使用Thread.stop(),儘管這可能會引發多個ThreadDeathException。你可以把它封裝到try try/catch/finally塊中,但是沒有保證。

0

線程停止()會在線程中引發錯誤。 ThreadDeath

模擬死於中線程序的唯一方法是調用System.exit()。

但是,這是非常隨機的,所以您必須多次執行測試才能確保應用程序的行爲正確無論它在哪裏死亡。

2

沒有便攜式方法。如果你想抑制終結器和關閉鉤子的運行,你可以嘗試在整個java進程中調用「kill -9」(或者你本地的等價物)。

您不會從這樣的測試中得到任何可重複的結果,但是如果您的程序正在寫入文件系統或數據庫並且可能會留下不一致的數據結構被殺時。

1

或者你可以......殺死進程。 (即,如果這是Linux,則向進程發送kill -9信號)。

如果你想測試某些東西 - 如果你希望嚴重崩潰 - 如果你特別不走運,它可能每個月只做一次。