public class ThreadEvent {
private final Object lock = new Object();
public void signal() {
synchronized (lock) {
lock.notify();
}
}
public void await() throws InterruptedException {
synchronized (lock) {
lock.wait();
}
}
}
Тогда используйте этот класс:
Создание темы:
ThreadEvent resultsReady = new ThreadEvent();
В методе это ожидание результатов:
resultsReady.await();
И в методе, который создает результаты после того, как все результаты были созданы:
resultsReady.signal();
EDIT:
(Извините за редактирование этого поста, но у этого кода очень плохое состояние гонки, и у меня недостаточно репутации, чтобы комментировать)
Вы можете использовать это, только если вы на 100% уверены, что signal () вызывается после await (). Это одна из основных причин, почему вы не можете использовать объект Java, например, например. События Windows.
Если код выполняется в следующем порядке:
Thread 1: resultsReady.signal();
Thread 2: resultsReady.await();
тогда поток 2 будет ждать вечно . Это потому, что Object.notify () пробуждает только один из запущенных в данный момент потоков. Нить, ожидающая позже, не пробуждается. Это очень отличается от того, как я ожидаю, что события будут работать, когда событие сигнализируется до тех пор, пока а) не дождется или б) не будет явно сброшено.
Примечание. В большинстве случаев вам следует использовать notifyAll (), но это не относится к описанной выше проблеме «жди вечно».