您是否考虑过 java.util.concurrent 中的一些类 - 例如 BlockingQueue?
你可以使用:
BlockingQueue<Boolean> conditionMet = new BlockingQueue<Boolean>;
conditionMet.poll(10,TimeUnit.SECONDS);
然后在更改条件的代码中执行以下操作:
conditionMet.put(true);
编辑:
另一个例子 java.util.concurrent 可能是 CountDownLatch:
CountDownLatch siteWasRenderedLatch = new CountDownLatch(1);
boolean siteWasRendered = siteWasRenderedLatch.await(10,TimeUnit.SECONDS);
这样您将等待 10 秒或直到闩锁达到零。要达到零,您只需:
siteWasRenderedLatch.countDown();
这样您就不需要使用@Adrian 提供的条件示例中需要的锁。我认为这更简单直接。
如果您不喜欢命名“Latch”或“Queue”,您可以随时将其包装到您自己的名为 LimitedTimeCondition 的类中:
public class LimitedTimeCondition
{
private CountDownLatch conditionMetLatch;
private Integer unitsCount;
private TimeUnit unit;
public LimitedTimeCondition(final Integer unitsCount, final TimeUnit unit)
{
conditionMetLatch = new CountDownLatch(1);
this.unitsCount = unitsCount;
this.unit = unit;
}
public boolean waitForConditionToBeMet()
{
try
{
return conditionMetLatch.await(unitsCount, unit);
}
catch (final InterruptedException e)
{
System.out.println("Someone has disturbed the condition awaiter.");
return false;
}
}
public void conditionWasMet()
{
conditionMetLatch.countDown();
}
}
而用法是:
LimitedTimeCondition siteRenderedCondition = new LimitedTimeCondition(10, TimeUnit.SECONDS);
//
...
//
if (siteRenderedCondition.waitForConditionToBeMet())
{
doStuff();
}
else
{
System.out.println("Site was not rendered properly");
}
//
...
// in condition checker/achiever:
if (siteWasRendered)
{
condition.conditionWasMet();
}