Java 中断/终止正在运行的线程
在发生特定超时时,我需要终止/取消/中断/使正在运行的线程失败。我使用ExecutorService来管理线程池,通过该池,我可以使用Future的cancel()方法取消任务,该方法将此任务从ExecutorService的视图中删除,但线程本身继续运行 在线环顾四周,有人使用isInterrupted()方法创建了一个循环,或者正在等待IO,这些IO可以通过呈现InterruptedException来处理Java 中断/终止正在运行的线程,java,multithreading,Java,Multithreading,在发生特定超时时,我需要终止/取消/中断/使正在运行的线程失败。我使用ExecutorService来管理线程池,通过该池,我可以使用Future的cancel()方法取消任务,该方法将此任务从ExecutorService的视图中删除,但线程本身继续运行 在线环顾四周,有人使用isInterrupted()方法创建了一个循环,或者正在等待IO,这些IO可以通过呈现InterruptedException来处理 杀死既没有循环(也没有任何其他挂钩)也没有等待IO的线程的一般做法是什么?环顾四周,
杀死既没有循环(也没有任何其他挂钩)也没有等待IO的线程的一般做法是什么?环顾四周,Thread.stop()似乎在做我需要的事情(只是盲目地杀死线程)但是不建议使用它。如果您使用的是
ExecutorService
,那么您不应该弄乱它的线程:这个概念隐藏在executor后面,executor是比线程更高级的概念,因此不提供管理它们的方法。我强烈建议您停止整个执行器,不要尝试停止其中一个线程
请注意,ExecutorService
中的线程正在循环,它们的循环包括等待任务队列中的任务可用
Java中没有简单的方法来停止不循环的线程,您可以做的是:
- 具有一个易失性布尔标志,线程的
会不时检查它是否应该停止(该标志可以用作线程循环中的条件)Runnable
- 调用
尝试(尽最大努力,如果您不知道自己在做什么,则非常不安全)停止与同步相关的等待/锁定/获取/。。。线卡住了Thread.interrupt()
public void run(){
if (Thread.currentThread().interrupted()) {
return;
}
//LogicA start
//LogicA end
if (Thread.currentThread().interrupted()) {
return;
}
//LogicB start
//LogicB end
if (Thread.currentThread().interrupted()) {
return;
}
//LogicLong start
//Long code here cannot end or exit or kill the thread now. Let it finish
//LogicLong ends
if (Thread.currentThread().interrupted()) {
return;
}
//LogicD start
//LogicD end
}
如果您已经阅读了执行服务,那么您已经收到了未来服务。因此,唯一明智且干净的取消作业的方法是调用
future.cancel(布尔值可能中断frunning)
。设置maybruptfrunning
将在作业当前运行时中断作业,而在作业未运行时不执行任何操作。因此,您只需偶尔检查Thread.interrupted()
,以尊重中断的方式编写作业
请注意作业和线程之间的区别。你提交了一份工作,因此你不应该试图绕过
ExecutorService
,这可能一点也不好玩。调用Future.cancel(true)
会给所有相关方一个明确的信号,告诉他们该做什么。永远都不应该做“盲目杀死线程”的事情。thread.stop()只适用于那些可以理解在每一行停止的结果的琐碎代码。这种类型的代码也很简单,可以添加行来检查中断标志。i、 即使在理论上,这也不是一个理想的解决方案。请谨慎使用Thread.interrupted():它会重置线程的中断状态,Java API中的许多类都会使用它,这会导致线程级别的中断被忽略。不完全是这样。在这里提供更多上下文,线程通过接口实例化一个类并调用该类的特定方法。这些方法的实现是由我的系统的用户定义的,我确实希望有像无限循环这样的缺陷。我想通过终止超过超时的作业来避免这种情况。@Niranjayakar:在这种情况下,可能应该在无限循环的开始检查中断检查。同意。但是我想要一个相当于SIGTERM/SIGKILL组合的线程。我对无限运行或有缺陷的作业感到不满,这些作业对我的系统来说可能很昂贵。