Нет.Вместо этого используйте Object.wait
и убедитесь, что вы синхронизируете объект, содержащий логическое значение.Если вы не синхронизируете и boolean
не является volatile
, у вас нет барьера памяти, поэтому нет никакой гарантии, что поток опроса увидит изменение в boolean
.
В соответствии с javadoc :
Этот метод заставляет текущий поток (назовем его T) поместить себя в набор ожидания для этого объекта, а затем отказаться от любых заявлений на синхронизацию для этого объекта, Поток 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();
}
}
}