Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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,在发生特定超时时,我需要终止/取消/中断/使正在运行的线程失败。我使用ExecutorService来管理线程池,通过该池,我可以使用Future的cancel()方法取消任务,该方法将此任务从ExecutorService的视图中删除,但线程本身继续运行 在线环顾四周,有人使用isInterrupted()方法创建了一个循环,或者正在等待IO,这些IO可以通过呈现InterruptedException来处理 杀死既没有循环(也没有任何其他挂钩)也没有等待IO的线程的一般做法是什么?环顾四周,

在发生特定超时时,我需要终止/取消/中断/使正在运行的线程失败。我使用ExecutorService来管理线程池,通过该池,我可以使用Future的cancel()方法取消任务,该方法将此任务从ExecutorService的视图中删除,但线程本身继续运行

在线环顾四周,有人使用isInterrupted()方法创建了一个循环,或者正在等待IO,这些IO可以通过呈现InterruptedException来处理


杀死既没有循环(也没有任何其他挂钩)也没有等待IO的线程的一般做法是什么?环顾四周,Thread.stop()似乎在做我需要的事情(只是盲目地杀死线程)但是不建议使用它。

如果您使用的是
ExecutorService
,那么您不应该弄乱它的线程:这个概念隐藏在executor后面,executor是比线程更高级的概念,因此不提供管理它们的方法。我强烈建议您停止整个执行器,不要尝试停止其中一个线程

请注意,
ExecutorService
中的线程正在循环,它们的循环包括等待任务队列中的任务可用

Java中没有简单的方法来停止不循环的线程,您可以做的是:

  • 具有一个易失性布尔标志,线程的
    Runnable
    会不时检查它是否应该停止(该标志可以用作线程循环中的条件)
  • 调用
    Thread.interrupt()
    尝试(尽最大努力,如果您不知道自己在做什么,则非常不安全)停止与同步相关的等待/锁定/获取/。。。线卡住了

我个人建议您选择中断路线,因为这是结束这条线索的最干净、最优雅的方式

让我们努力明确我们的目标。线程只不过是一个单独的进程,它将执行您分配给它的一组任务。可能您必须在代码中找到可中断点,并在这些点上执行interrupted()检查。显然,这些观点本应达到合乎逻辑的结局

比如说,

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组合的线程。我对无限运行或有缺陷的作业感到不满,这些作业对我的系统来说可能很昂贵。