这个问题在这里已经有答案了:
如何在java中终止线程((16个答案)
11天前关门了。
我想创建一个线程来判断用户代码:
FutureTask<Integer> futureTask = new FutureTask(() -> run(type)); // run is a method
Thread thread = new Thread(futureTask);
thread.start();
众所周知,用户代码中可能会编写一个无限循环,因此 run
将一直工作和线程 thread
不会停止。我想终止这个 thread
超时持续时间后。我怎样才能终止它而不是使用 Thread.stop
因为不安全?
2条答案
按热度按时间aamkag611#
从外部终止线程总是不安全的,强烈建议不要这样做。您需要通知线程您希望它终止,并且线程必须自己终止。这是用方法完成的
interrupt()
类线程。在您的示例中,它将从主代码调用thread.interrupt()
这将导致中断标志在线程中被提升。在你的run
线程的方法,您应该检查该标志(请参阅方法)interrupted()
以及isInterrupted()
在类线程中)。一旦您看到您的标志被升起,就中断循环并完成方法。那会阻止你的线程。fivyi3re2#
处理需要停止的线程的正确方法是设计线程的代码,使其对被中断做出适当的响应:
长时间的计算需要偶尔检查当前线程的“中断”标志。
InterruptedException
应妥善处理。线程应用程序代码对中断的响应应该是优雅地停止它正在做的事情,并且(通常)允许线程终止。
(您还可以使用使用
volatile
共享变量而不是中断标志。但是,这不涉及打断wait
,sleep
和类似的操作,因此不能很好地替代中断。)不安全的方法是调用不推荐的
Thread.stop()
方法(javadocs解释了为什么它是不安全的,我们不需要在这里重复。)(相关)
Thread.stop(Throwable)
方法在Java11中被删除;请参见:Java11删除了stop()和destroy()方法。
https://bugs.openjdk.java.net/browse/jdk-8204243
不幸的是,这两种方法之间没有中断线程的方法。
如果你不能让你的长时间运行的线程合作,安全的选择是在一个单独的进程中运行它;e、 g.使用
System.ProcessBuilder
等等java
命令。如果时间太长,(外部)进程可能会被终止。不利因素包括:外部进程不能访问当前jvm的变量,等等。因此,需要使用不同的机制在父进程和子进程之间传递信息。
启动一个新的jvm比启动一个新线程要昂贵得多。
1-例如,如果线程拥有打开的文件或套接字等资源,则应该释放它们。如果它正在为等待结果的其他线程执行操作,它应该(以适当的方式)发出没有结果的信号。等等。