2

是否可以在不引发异常的情况下杀死 Java 线程?

这仅用于测试目的-我想模拟整个计算机在线程中死机的情况。

注意 - 我看到了一个不推荐使用的Thread.destroy()方法,但文档说它从来没有被实现过。

4

6 回答 6

6

不,存在已弃用的“固有不安全”Thread.stop()方法,但正如其注释所强调的那样,事情可能会处于严重损坏的状态,并且 ThreadDeath 错误仍会在线程内引发。

Sun 对 的问题的解释(stop()在它似乎工作很长时间后就会显现出来)位于:

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

杀死 JVM 进程(或拔掉插头)不是更好地模拟计算机死亡吗?

于 2009-07-09T06:20:58.420 回答
2

没有可移植的方法。如果您想抑制终结器和关闭挂钩的运行,您可以尝试在整个 java 进程上调用“kill -9”(或您的本地等效项)。

你不会从这样的测试中得到任何可重复的结果,但是如果你的程序正在写入文件系统或数据库并且可能会在被终止时留下不一致的数据结构,那么执行几千次这样的测试可能会很有趣.

于 2009-07-09T06:27:53.973 回答
1

或者你可以......终止进程。(即,如果这是 Linux,则向进程发送 kill -9 信号)。

如果您正在尝试测试某些东西,请注意比赛问题 - 如果您希望严重崩溃 - 如果您特别不走运,它可能每月只做一次。

于 2009-07-09T06:33:52.543 回答
0

你测试的重点是什么?Java 不保证出口会发生什么,除了在出口是“干净”出口时尝试运行关闭钩子

这听起来类似于在程序运行的情况下尝试测试程序的行为OutOfMemory;您对此无能为力,也无法确定地告诉您会发生什么

于 2009-07-09T06:19:48.313 回答
0

有什么理由不能使用 Thread.suspend()?它将停止线程,以便您可以检查线程中断时的状态。

您也可以使用 Thread.stop() 尽管这可能会引发多个 ThreadDeathExceptions。您可以将其包装在 try/catch/finally 块中,但不能保证。

于 2009-07-09T06:20:26.203 回答
0

线程 stop() 在线程中引发错误。线程死亡

模拟应用程序终止中间线程的唯一方法是调用 System.exit()。

但是,这是非常随机的,因此您必须多次执行测试才能确信您的应用程序无论在何处都可以正常运行。

于 2009-07-09T06:25:26.070 回答