首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何显式释放CountDownLatch

如何显式释放CountDownLatch
EN

Stack Overflow用户
提问于 2014-11-20 16:31:35
回答 5查看 1.9K关注 0票数 2

有没有办法在不使用countDown()的情况下显式地释放CountDownLatch - means。

例如:假设我正在等待100个线程执行countDown(),但是如果有什么事情失败了,我想释放这个锁存器而不再等待。我想在闩锁上使用getCount() &然后使用for cycle do countDown(),但这并不是最优的方式。

有什么建议/想法吗?

EN

回答 5

Stack Overflow用户

发布于 2014-11-20 16:33:53

CountDownLatch有一个重载的await()方法,该方法将时间和时间单位作为输入,并在给定时间过去后释放锁

票数 2
EN

Stack Overflow用户

发布于 2014-11-20 16:34:04

您可以使用与CountDownLatch很接近的Semaphore,它的impl具有操作它的方法:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Semaphore.html

票数 1
EN

Stack Overflow用户

发布于 2014-11-20 16:37:17

为什么不直接使用带有超时的等待呢?

代码语言:javascript
复制
boolean await(long timeout, TimeUnit unit);

如果经过了指定的等待时间,则返回值false,否则在等待完成时返回true。

Abort countDownLatch.await() after time out

如果你想停止其他线程的执行,如果有任何线程失败,你需要一些额外的通信层。

例如:

代码语言:javascript
复制
AtomicBoolean kill = new AtomicBoolean(false);
CountDownLatch latch = new CountDownLatch(SOME_NUM);

class Task extends Runnable {
     public void run() {
         try {
              ....
              if (kill.get())
                  throw new Exception();
              ....
         } catch (Throwable throwable) {
            kill.set(true);
         } finally {
            countDownLatch.countDown();
         }
     }
}

如果您只想在Throwable上释放count down,而不管其他进程,您可以在Exception上执行循环中的countDown

代码语言:javascript
复制
class Task extends Runnable {
     public void run() {
         try {
              ....
         } catch (Throwable throwable) {
            while(countDownLatch.getCount() != 0)
               countDownLatch.countDown();
         } finally {
            countDownLatch.countDown();
         }
     }
}

您可以组合2个countDown任务

代码语言:javascript
复制
CountDownLatch A = new CountDownLatch(1);
CountDownLatch B = new CountDownLatch(1);

class CountDownTracker extend Runnable {
     public void run() {
         B.await();
         A.countDown();
     }
}

class Task extends Runnable {
     public void run() {
         try {
              ....
         } catch (Throwable throwable) {
            A.countDown();
         } finally {
            B.countDown();
         }
     }
}

在这种情况下,A将在完成或任何任务失败后完成。

以此类推。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27034958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档