Ответ 1
Нет. Используйте Object.wait
и убедитесь, что вы синхронизируете объект, содержащий логическое значение. Если вы не синхронизируете, а boolean
не volatile
, у вас нет барьера памяти, поэтому нет гарантии, что поток опроса увидит изменение в boolean
.
В соответствии с javadoc:
Этот метод заставляет текущий поток (называть его T) размещать себя в наборе ожидания для этого объекта, а затем отказываться от любых и всех требований к синхронизации для этого объекта. Thread T отключается для целей планирования потоков и находится в состоянии покоя, пока не произойдет одна из четырех вещей:
- Другой поток вызывает метод
notify
для этого объекта, а поток T выбирается произвольно как поток, который нужно разбудить.- Некоторый другой поток вызывает метод
notifyAll
для этого объекта.- Некоторые другие потоки прерывают поток T.
- ...
чтобы поток не принимал процессор, пока он ждет уведомления.
Ниже приведен простой простой флаг с методом waitUntilIdle
, который может вызывать метод main
, и метод setIdle
, который может быть вызван другим потоком.
public class IdleFlag {
private boolean idle;
public void waitUntilIdle() throws InterruptedException {
synchronized (this) {
while (true) {
// If the flag is set, we're done.
if (this.idle) { break; }
// Go to sleep until another thread notifies us.
this.wait();
}
}
}
public void setIdle() {
synchronized (this) {
this.idle = true;
// Causes all waiters to wake up.
this.notifyAll();
}
}
}