java - 如何在 CountDownLatch.await() 中断时取消关联的 Runnables

标签 java concurrency java.util.concurrent

我正在使用 java.util.concurrent.CountDownLatch 对象 (latch) 来控制一组执行的 Runnable通过线程池(也可以执行其他Runnable)。

在某些(和理想的)情况下,主线程在 latch.await() 中等待时会被中断。我需要捕获并处理 java.lang.InterruptedException

我想要做的是中断当前在线程池中代表此特定闩锁运行的所有线程,并取消在该池中排队运行的任何Runnable。重申一下:我不能简单地中断池中的所有内容并取消所有待处理的排队 Runnable,因为它被其他进程使用。

我认为这是一个标准构造,但找不到它。

因此,在我开始从头开始实现这一点之前,我很高兴知道 Java 是否有一个固定对象或执行此操作的标准方法。

最佳答案

can't simply interrupt everything in the pool and cancel all pending queued Runnables as it used by other processes

对此最简单的解决方法是将这些 Runnable 分离到它们自己的线程池中,这样您就可以仅在该池上调用 shutdownNow() ,这会中断所有线程该池中的任务。听起来你不能这样做。

另一种方法是教您的代码查找 volatile boolean 关闭字段,并在该字段变为true后停止运行。

 static final volatile boolean shutdown;
 ...
 public void run() {
      if (shutdown) {
         return;
      }
      ...
 }

或者如果你的任务循环,那么你会这样做:

 public void run() {
      while (!shutdown && !Thread.currentThread().isInterrupted()) {
         ...
      }
 }

如果您无法控制 Runnable 类,那么您可以编写一个小的包装类来查看 shutdown boolean 值:

 public class WrappedRunnable implements Runnable {
      private final Runnable delegate;
      public WrappedRunnable(Runnable delegate) {
          this.delegate = delegate;
      }
      public void run() {
          if (!shutdown) {
             delegate.run();
          }
      }
 }

关于java - 如何在 CountDownLatch.await() 中断时取消关联的 Runnables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17277442/

相关文章:

java - 使用 python 调用并打印 Java 的输出

java - 获取给定字符串的值

c# - worker 线程可以在GUI中读取控件吗?

Spring并发处理RabbitMQ消息

java - Callable 和 Future 返回异常

java - 我的简单 antlr 语法有什么问题?

java - Spark (JAVA): how to read and save data file from the http body(Audio file)?

java - 启用 java 安全管理器时,获取系统属性 "os.arch"时权限被拒绝

java - 确保任务是可中断的

使用 Executor 的 JavaFX 应用程序在退出时挂起