我怎样才能立即终止一个线程? (不中断)

时间:2015-11-15 22:46:15

标签: java multithreading

这不是关于如何干净地终止一个线程的问题,即通过调用它的中断并让线程适当地响应。我无法以任何方式修改线程正在执行的代码。

我特别想立即终止一个Thread,我根本不关心什么状态。我知道使用Thread.stop可能有类似的东西,但这实际上会引发一个ThreadDeath异常,并且对于无法捕获线程来终止此异常。但是,我正在处理的代码捕获了这个异常并且没有重新抛出它。

Thread.destroy()似乎是我正在寻找的,但是这个方法从未实现过。有没有其他方法可以实现这个目标?

4 个答案:

答案 0 :(得分:4)

我相信在Java中没有办法像你所描述的那样杀死一个线程。正如您在评论中指出的那样,interrupt将无法满足您的需求。如果线程正在执行,它只是设置一个标志,并由线程注意它。如果线程正在等待或正在休眠,它将抛出InterruptedException

我能想象你正在描述的唯一方法就是杀死线程运行的进程。 (例如,致电System.exit(int)。)

答案 1 :(得分:2)

没有办法。来自Java Concurrency in Practice

  

由于没有先发制人的方式来阻止线程,所以必须改为   被说服自己关闭。

如你所说,中断线程不是更干净的方式。干净的方式可能是:

  1. ExecutorService.shutdown()
  2. Future.cancel()
  3. 毒丸
  4. 您并不打算向threads提交需要很长时间才能完成的任务。您宁愿将它们分成较小的任务并发送poison pill来取消更大的任务。如果没有办法做到这一点,那么spawn/fork一个process如果你想取消任务就杀掉它。

答案 2 :(得分:1)

如果你不相信有问题的线程需要杀死它,你可能最好在一个单独的进程中运行它,然后杀掉进程。

无论如何,如果你对弃用的Thread方法没问题,下面的代码可能会有效:

    while (theThread.isAlive()) {
        theThread.stop();
    }

取决于线程试图生存的严重程度......

如果这还不够,您可能希望在多个线程中运行此代码或重复stop()调用。但是,我设法使用以下代码终止以下线程:

    final Thread iWontDie = new Thread(() -> {
        int i = 0;
        while (true) {
            try {
                System.out.println("I'm still alive! " + ++i);
            } catch (Throwable t) {
                // eat t
            }
        }
    });
    iWontDie.start();

答案 3 :(得分:0)

如果您使用的是Java 7或更早版本,则可以使用重载的stop(Throwable obj)方法抛出除ThreadDeath错误之外的其他内容:

  

强制线程停止执行。如果参数objnull,则抛出NullPointerException(在当前线程中)。该线程表示的线程被强制停止异常处理,并将Throwable对象obj作为异常抛出。这是一个不寻常的行动;通常,应该使用不带参数的stop方法。

此方法与无参数版本一样,已弃用,因此请记住这一点。