【问题标题】:Killing thread instantly in Java在Java中立即杀死线程
【发布时间】:2010-11-09 06:44:47
【问题描述】:

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

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

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

【问题讨论】:

  • 在 Windows 上,使用进程资源管理器杀死进程中的线程。

标签: java multithreading kill


【解决方案1】:

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

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

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

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

【讨论】:

  • 如果我想从集成测试中做到这一点。
  • 好吧,如果您使用stop(),它可能会污染进程/堆,因此后续测试不干净和独立。您可以在 JVM 之外进行集成测试,以终止并重新启动 Java 进程。如果半完成 IO 是一个问题,您可能有一个外部进程卸载驱动器或执行其他讨厌的事情。我认为这些可能是最接近可重现的系统死亡模拟。
  • 那么如果在集成测试中完成呢?只需为该测试启动一个新的 JVM! (有什么问题?)
  • 如果你想测试一个杀死机器/JVM的主要故障,那么强制杀死(*nix上的kill -9)绝对是你想要用于测试的。正如@Arafangion 提到的,如果您为该特定测试启动 JVM,这很容易完成。
  • 我认为启动一个新的 JVM 有点矫枉过正,但也许这只是一种非理性的恐惧,因为我还没有这样做。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 重点是检查事务处理。如果计算机在线程中途死机,事务将回滚,另一台计算机(= 服务)最终应接手事务中的作业。
      • 你写过事务层吗?还是你用的是别人的
      • 这听起来像是需要在“集成”测试中进行测试 - 而不是单元测试。也就是说,您确实确实在事务中的某个点退出了程序
      • 这是一个集成测试,但这只是一个不同的名称。实际上,它在相同的套件、相同的持续集成流程等下运行......
      • 使用别人的事务层。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-22
          • 2011-05-30
          • 1970-01-01
          • 2011-07-11
          • 1970-01-01
          • 1970-01-01
          • 2020-09-11
          • 2023-04-01
          相关资源
          最近更新 更多