我写了一个类CountDownLatchContainer
,它有一个await()
方法,等待所有 CountDownLatches。一切正常。
public final class CountDownLatchContainer
{
private final Set<CountDownLatch> countDowns;
public CountDownLatchContainer(List<CountDownLatch> countDowns)
{
this.countDowns = new HashSet<CountDownLatch>(countDowns);
}
public void await() throws InterruptedException
{
for (CountDownLatch count : countDowns)
count.await();
}
}
为了科学和艺术(:D),我想扩展功能并添加public boolean await(long timeout, TimeUnit unit)
fromCountDownLatch
类。
我希望每个倒计时锁存器具有相同的超时时间,并且该方法总体上只是为了阻止timeout
TimeUnits 的数量。我很难做到这一点。我所拥有的是:
public boolean await(long timeout, TimeUnit unit) throws InterruptedException
{
boolean success = true;
for (CountDownLatch count : countDowns)
success &= count.await(timeout / countDowns.size(), unit);
return success;
}
因此,总超时得到处理,但每次倒计时只占总时间的百分比。
那么如何在不超过总时间的情况下为单个锁存器提供与方法参数中指定的时间相同的时间?
这里有一个可视化。感谢 hexafraction 的 ascii 艺术灵感。
|-----------------------------|
Total
|-----------------------------|
L1
|-----------------------------|
L2
|-----------------------------|