是否可以在不引发异常的情况下终止Java线程?
这仅用于测试目的 - 我想模拟整个计算机死于中间线程的情况。
注意 - 我看到了一个弃用的Thread.destroy()
方法,但文档说它从未实现过。
答案 0 :(得分:6)
没有。有一个被弃用的,“本质上不安全”的Thread.stop()
方法,但正如其评论强调的那样,事情可能会处于严重损坏的状态,并且线程中仍会抛出ThreadDeath错误。
Sun对stop()
问题的解释,可能会在看似有用之后很久就显现出来,是:
http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
不会杀死JVM进程(或者拔掉插件)是否可以更好地模拟计算机死机?
答案 1 :(得分:2)
没有便携式方法。如果要抑制终结器和关闭挂钩的运行,可以尝试在整个java进程中调用“kill -9”(或本地等效项)。
您不会从这样的测试中获得任何可重复的结果,但是如果您的程序正在写入文件系统或数据库并且可能会留下不一致的数据结构,那么执行此类测试几千次可能会很有趣被杀的时候。
答案 2 :(得分:1)
或者你可以......杀死这个过程。 (即,如果这是Linux,则向进程发送kill -9信号)。
如果你想尝试某些东西,请注意竞赛问题 - 如果你希望严重崩溃 - 如果你特别不走运,它可能每月只进行一次。
答案 3 :(得分:0)
你的考试有什么意义?除了尝试运行关闭挂钩(如果退出是“干净的”)时,Java不保证退出时会发生什么
这听起来类似于尝试测试程序的行为OutOfMemory
;你无能为力,无法确定地告诉会发生什么
答案 4 :(得分:0)
你有什么理由不能使用Thread.suspend()吗?它将停止线程,以便您可以在线程中断时检查状态。
您也可以使用Thread.stop(),但冒着丢失多个ThreadDeathExceptions的风险。你可以将它包装在try / catch / finally块中,但是没有保证。
答案 5 :(得分:0)
线程stop()在线程中抛出错误。的ThreadDeath
模拟正在运行的中间线程的应用程序的唯一方法是调用System.exit()。
然而,这是非常随机的,因此您必须多次执行测试,以确保您的应用程序无论在何处死亡都能正确运行。