【发布时间】:2010-11-09 06:44:47
【问题描述】:
是否可以在不引发异常的情况下终止 Java 线程?
这仅用于测试目的 - 我想模拟整个计算机在线程中死机的情况。
注意 - 我看到了一个已弃用的 Thread.destroy() 方法,但文档说它从一开始就没有实现。
【问题讨论】:
-
在 Windows 上,使用进程资源管理器杀死进程中的线程。
标签: java multithreading kill
是否可以在不引发异常的情况下终止 Java 线程?
这仅用于测试目的 - 我想模拟整个计算机在线程中死机的情况。
注意 - 我看到了一个已弃用的 Thread.destroy() 方法,但文档说它从一开始就没有实现。
【问题讨论】:
标签: java multithreading kill
没有。有已弃用的“固有不安全”Thread.stop() 方法,但正如其注释所强调的那样,事情可能会处于严重损坏的状态,并且 ThreadDeath 错误仍会在线程内引发。
Sun 对stop() 的问题的解释(在它似乎工作很长时间后就会显现出来)位于:
http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
杀死 JVM 进程(或拔掉插头)不是更好地模拟计算机死机吗?
【讨论】:
stop(),它可能会污染进程/堆,因此后续测试不干净和独立。您可以在 JVM 之外进行集成测试,以终止并重新启动 Java 进程。如果半完成 IO 是一个问题,您可能有一个外部进程卸载驱动器或执行其他讨厌的事情。我认为这些可能是最接近可重现的系统死亡模拟。
没有可移植的方法。如果您想抑制终结器和关闭挂钩的运行,您可以尝试在整个 java 进程上调用“kill -9”(或本地等效项)。
你不会从这样的测试中得到任何可重复的结果,但是如果你的程序正在写入文件系统或数据库并且可能会留下不一致的数据结构,那么执行几千次这样的测试可能会很有趣被杀的时候。
【讨论】:
或者你可以……终止进程。 (即,如果这是 Linux,则向进程发送 kill -9 信号)。
如果您尝试测试某些东西,请注意比赛问题 - 如果您希望严重崩溃 - 如果您特别不走运,它可能每月只测试一次。
【讨论】:
你的测试有什么意义? Java 不保证出口会发生什么,除了在出口是“干净”出口时尝试运行关闭钩子
这听起来类似于在程序运行OutOfMemory 的情况下尝试测试程序的行为;您对此无能为力,也无法确定会发生什么
【讨论】:
你有什么理由不能使用 Thread.suspend()?它将停止线程,以便您检查线程中断时的状态。
您也可以使用 Thread.stop(),尽管这可能会引发多个 ThreadDeathExceptions。您可以将其包装在 try/catch/finally 块中,但不能保证。
【讨论】:
Thread stop() 在线程中引发错误。线程死亡
模拟应用程序终止的中间线程的唯一方法是调用 System.exit()。
但是,这是非常随机的,因此您必须多次执行测试才能确信您的应用程序在任何地方都可以正常运行。
【讨论】: