如何终止java中的持久线程?

a14dhokn  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(287)

这个问题在这里已经有答案了

如何在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 因为不安全?

aamkag61

aamkag611#

从外部终止线程总是不安全的,强烈建议不要这样做。您需要通知线程您希望它终止,并且线程必须自己终止。这是用方法完成的 interrupt() 类线程。在您的示例中,它将从主代码调用 thread.interrupt() 这将导致中断标志在线程中被提升。在你的 run 线程的方法,您应该检查该标志(请参阅方法) interrupted() 以及 isInterrupted() 在类线程中)。一旦您看到您的标志被升起,就中断循环并完成方法。那会阻止你的线程。

fivyi3re

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-例如,如果线程拥有打开的文件或套接字等资源,则应该释放它们。如果它正在为等待结果的其他线程执行操作,它应该(以适当的方式)发出没有结果的信号。等等。

相关问题