Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的即时终止线程_Java_Multithreading_Kill - Fatal编程技术网

Java中的即时终止线程

Java中的即时终止线程,java,multithreading,kill,Java,Multithreading,Kill,是否可以在不引发异常的情况下终止Java线程 这只是为了测试的目的-我想模拟一个情况,当整个计算机在线程中死亡 注意-我看到一个弃用的Thread.destroy()方法,但文档中说它从一开始就没有实现过。您的测试有什么意义?Java不保证出口上会发生什么,除了在出口是“干净”的情况下尝试运行关闭挂钩之外 这听起来类似于在程序退出内存时测试程序的行为;对此您无能为力,也无法确定会发生什么情况有什么原因不能使用Thread.suspend()吗?它将停止线程,以便在线程中断时检查状态 您也可以使用

是否可以在不引发异常的情况下终止Java线程

这只是为了测试的目的-我想模拟一个情况,当整个计算机在线程中死亡


注意-我看到一个弃用的
Thread.destroy()
方法,但文档中说它从一开始就没有实现过。

您的测试有什么意义?Java不保证出口上会发生什么,除了在出口是“干净”的情况下尝试运行关闭挂钩之外


这听起来类似于在程序退出内存时测试程序的行为;对此您无能为力,也无法确定会发生什么情况

有什么原因不能使用Thread.suspend()吗?它将停止线程,以便在线程中断时检查状态


您也可以使用Thread.stop(),尽管这可能会引发多个threaddeAtheException。您可以将其包装到try/catch/finally块中,但没有任何保证。

否。存在不推荐使用的“固有不安全的”
Thread.stop()
方法,但正如它的注释所强调的那样,可能会使事物处于严重损坏的状态,线程内仍会抛出ThreadDeath错误

Sun对
stop()
出现的问题的解释如下:

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

Thread stop()在线程中抛出错误。线状死亡

模拟应用程序线程的唯一方法是调用System.exit()


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

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


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

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


如果您正在尝试测试某个东西(如果您希望崩溃得很厉害),那么请注意竞争问题。如果您运气特别不好,它可能每月只测试一次。

关键是检查事务处理。如果计算机在线程中死机,事务将回滚,另一台计算机(=服务)将最终接收事务中的作业。您是否编写了事务层?或者你正在使用其他人的测试这听起来像是需要在“集成”测试中进行测试,而不是单元测试。i、 e.您确实会在事务中的某个点退出程序。这是一个集成测试,但这只是一个不同的名称。实际上,它在相同的套件、相同的连续集成进程等下运行…使用其他人的事务层。如果我想从集成测试中执行,则不会。如果使用
stop()
,它可能会破坏进程/堆,因此后续测试不干净且不独立。您可以在JVM之外进行集成测试,以终止并重新启动Java进程。如果担心IO完成一半,您可能需要一个外部进程卸载驱动器或执行其他肮脏的操作。我认为这些可能是最接近于系统死亡的可复制模拟。那么,如果它是在集成测试中完成的呢?只需为该测试启动一个新的JVM!(问题是什么?)如果您想测试导致机器/JVM死机的主要故障,那么强制死机(kill-9 on*nix)肯定是您想用于测试的。正如@Arafangion所提到的,如果你为特定的测试启动一个JVM,这很容易做到。我认为启动一个新的JVM是过分的,但这可能只是一种非理性的恐惧,因为我还没有这样做。在windows上,使用进程资源管理器来杀死进程内的线程。