Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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 - Fatal编程技术网

Java 如何立即终止线程?(不打断)

Java 如何立即终止线程?(不打断),java,multithreading,Java,Multithreading,这不是一个关于如何干净地终止线程的问题,即通过调用中断并让线程做出适当的响应。我无法修改线程以任何方式执行的代码 我特别想立即终止一个线程,我根本不关心事情处于什么状态。我知道使用Thread.stop可以实现类似的功能,但是这实际上会引发ThreadDeath异常,并且无法捕获终止该异常的线程。然而,我正在处理的代码捕获了这个异常,并且没有重新引用它 Thread.destroy()似乎就是我要寻找的,但是这个方法从未实现过。有没有其他方法可以做到这一点?我相信Java中没有任何方法可以像您所

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

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


Thread.destroy()似乎就是我要寻找的,但是这个方法从未实现过。有没有其他方法可以做到这一点?

我相信Java中没有任何方法可以像您所描述的那样杀死一个线程。正如您在评论中所指出的,
中断
不会执行您想要的操作。如果线程正在执行,它只是设置一个标志,由线程来注意它。如果线程正在等待或休眠,它将抛出一个
中断异常


我所能想象的做您所描述的事情的唯一方法是终止线程正在运行的进程。(例如,调用
System.exit(int)

如果您使用的是Java 7或更早版本,您可以使用重载方法抛出除
线程死亡
错误之外的其他错误:

强制线程停止执行。如果参数
obj
null
,将抛出
NullPointerException
(在当前线程中)。此线程所代表的线程被强制停止其异常执行的任何操作,并作为异常抛出
Throwable
object
obj
。这是一个不寻常的行动;通常,应该使用不带参数的stop方法


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

不,没有办法。从实践中的Java并发:

因为没有先发制人的方法来停止线程,所以它们必须取而代之 被说服自行关闭

中断线程并不像你说的那样干净。清洁方式可以是:

  • ExecutorService.shutdown()
  • Future.cancel()
  • 毒丸

  • 您不需要向
    线程提交需要很长时间才能完成的任务。您更愿意将它们划分为较小的任务,并发送
    毒药丸来取消较大的任务。如果没有这样做的方法,那么
    spawn/fork
    a
    进程
    ,如果您想取消任务,就杀死它。

    如果您不信任所讨论的线程,以至于需要杀死它,您可能最好在单独的进程中运行它,然后杀死该进程

    无论如何,如果您对不推荐使用的
    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();
    

    您确实中断了,它将停止执行,并在下一个循环中被gc'ed。问题是什么?中断不只是设置中断标志或抛出异常吗?(在我正在处理的代码中被捕获)线程实际上从未停止执行,只是设置了一个标志。有趣的是,Java 8中的
    stop(Throwable obj)
    方法总是抛出
    UnsupportedOperationException
    ,实际上不会杀死线程。这种技术并不总是有效的。“需要注意的是,在等待线程不响应
    线程.interrupt
    的所有情况下,它也不会响应
    线程.stop
    。这种情况包括故意拒绝服务攻击,以及thread.stop和thread.interrupt不能正常工作的I/O操作。”我喜欢这个答案,它适用于我在关于捕获ThreadDeath的问题中提到的示例,因为当它在catch块中时会调用stop,此时ThreadDeath错误会再次抛出,现在可以正确地向上传播。然而,正如Ted Hopp提到的,这并不一定总是有效的,特别是当线程试图获取监视器时(死锁),它不会响应stop。尽管如此,我还是喜欢你的想法,在它死之前给它发垃圾邮件。谢谢。不是我希望的答案,而是我期待的答案。