有没有办法在不使用countDown()的情况下显式地释放CountDownLatch - means。
例如:假设我正在等待100个线程执行countDown(),但是如果有什么事情失败了,我想释放这个锁存器而不再等待。我想在闩锁上使用getCount() &然后使用for cycle do countDown(),但这并不是最优的方式。
有什么建议/想法吗?
发布于 2014-11-20 16:33:53
CountDownLatch有一个重载的await()方法,该方法将时间和时间单位作为输入,并在给定时间过去后释放锁
发布于 2014-11-20 16:34:04
您可以使用与CountDownLatch很接近的Semaphore,它的impl具有操作它的方法:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Semaphore.html
发布于 2014-11-20 16:37:17
为什么不直接使用带有超时的等待呢?
boolean await(long timeout, TimeUnit unit);如果经过了指定的等待时间,则返回值false,否则在等待完成时返回true。
Abort countDownLatch.await() after time out
如果你想停止其他线程的执行,如果有任何线程失败,你需要一些额外的通信层。
例如:
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
class Task extends Runnable {
public void run() {
try {
....
} catch (Throwable throwable) {
while(countDownLatch.getCount() != 0)
countDownLatch.countDown();
} finally {
countDownLatch.countDown();
}
}
}您可以组合2个countDown任务
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将在完成或任何任务失败后完成。
以此类推。
https://stackoverflow.com/questions/27034958
复制相似问题