Рассматривали ли вы вместо этого 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
, но тогда вы не сможете "сбросить" его:)