我正在使用 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/