您是否考虑过改用
wait/
notify(等价于
Monitor.Wait和
Monitor.Pulse)?
您需要进行一点检查,以查看您是否确实 需要 等待(避免出现竞争状况),但是它应该可以工作。
否则,类似的事情
CountDownLatch可能会做您想要的。
编辑:我只注意到这
CountDownLatch基本上是“单一用途”-就我所知,您以后不能重置计数。您可能想要
Semaphore代替。
tryAcquire像这样使用来等待超时:
if (semaphore.tryAquire(5, TimeUnit.SECONDS)) { ... // Permit was granted before timeout} else { // We timed out while waiting}请注意,这与
ManualResetEvent每次成功调用
tryAcquire都会减少许可数量不同-
因此最终它们将再次用尽。您无法像使用那样使它永久“设置”
ManualResetEvent。(可以使用
CountdownLatch,但是您无法“重置”它:)



