gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:24:28 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com