【问题标题】:How to correctly shutdown all threads?如何正确关闭所有线程?
【发布时间】:2014-06-11 12:26:08
【问题描述】:

我有 8 个线程,每个线程在它们的 run 方法中执行类似于此的循环:

for (int i = 0; i < someVar; i++) {
   for (int j = 0; j < someOtherVar; j++) {
       if (Thread.currentThread().isInterrupted()) {
           return;
       }
       // another loop and some calculations here
   }
}

我这样开始线程:

 executor = Executors.newFixedThreadPool(threads);

 // generate the threads and run them
 for (int i = 0; i < threads; i++) {
    MyClass cls = new MyClass(i);
    executor.execute(cls);
 }

现在我需要能够立即杀死我的线程,这就是为什么我在上面添加了 if 语句并在另一点使用 executor.shutdownNow()。但它的工作速度还不够快。某些计算可能需要几秒钟才能完成并开始下一次迭代。

还有其他可靠的方法可以立即关闭线程吗?

【问题讨论】:

  • 为什么还不够快?
  • 使用Future
  • 我认为首先要做的是测量任务在检查中断之间的时间间隔,并尝试通过引入更多检查来缩短该间隔。你试过吗?
  • 如果这些任务正在等待或休眠或侦听套接字或任何你应该提到的东西。更多代码会有所帮助。

标签: java multithreading


【解决方案1】:

您需要一个调用线程并停止当前执行的中断操作。以下是一些文档:http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

中断是一个线程的指示,它应该停止正在做的事情并做其他事情。线程如何响应中断由程序员决定,但线程终止是很常见的。

【讨论】:

  • ?执行程序 shutdownnow 方法正在执行中断。我看不出这对 OP 有何帮助,在我看来他已经意识到了这一点。
  • 处理中断的异常与在每个周期循环轮询线程是否有挂起的中断非常不同。我认为实现的方式是,如果您没有捕获中断的异常,那么线程会捕获它并设置标志。如果你抓住它,你的反应会更快。
  • 某些东西必须触发中断异常。你猜他在睡觉和吃 InterruptedException 并一直持续到下一次检查?由于 OP 正在进行计算,因此任务似乎不太可能处于休眠状态。但这不是第一次有人问一个含糊不清的问题,然后结果证明发生了一些古怪的事情。
  • 主线程导致InterruptedException。线程接收并立即停止处理器中的计算,并使用新声明的中断处理程序。如果没有 Catch for InterruptedException,另一个默认处理程序只是设置“中断”标志以供稍后查看,然后返回执行。这对于 Java 来说是非常低级的,对于 C 程序员来说更熟悉。
  • 那么如果有某种默认处理程序,为什么编译器会要求您在调用Thread.sleep(); 时添加一个try-catch?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
相关资源
最近更新 更多