0

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

在某些(和可取的)实例中,主线程在等待时被中断latch.await()。我需要抓住并处理java.lang.InterruptedException

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

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

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

4

2 回答 2

1

不能简单地中断池中的所有内容并取消所有待处理的排队 Runnables,因为它被其他进程使用

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

另一种方法是教您的代码查找volatile boolean shutdown字段并在该字段转到true.

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

或者,如果您的任务循环,那么您将执行以下操作:

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

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

 public class WrappedRunnable implements Runnable {
      private final Runnable delegate;
      public WrappedRunnable(Runnable delegate) {
          this.delegate = delegate;
      }
      public void run() {
          if (!shutdown) {
             delegate.run();
          }
      }
 }
于 2013-06-24T14:24:30.840 回答
0

我的解决方案受@Gray 启发,是扩展CountDownLatch以包含一个字段private volatile boolean m_interrupted = false;

然后在@Override public void CountDownLatch.await()我将这个标志设置为true如果我抓住一个java.lang.InterruptedException物体。

关于这一点的巧妙之处在于,我已经通过latch了所有的Runnables 来调用latch.countDown()finally 块。

所以在我扩展的课程中,我Runnable在做任何进一步的工作之前检查中断状态。

(使用 停止任何正在运行的线程interrupt())。

于 2013-06-24T15:42:44.167 回答