Путаница здесь, похоже, связана с идеей "уведомления потока".Вы (обычно) не вызываете notify
, notifyAll
или wait
объекта Thread
.Вызовите любой объект, который вы используете в качестве блокировки.(Особая проблема с Thread
заключается в том, что он уже используется в качестве блокировки для определенной цели (Thread.join
).)
Так что вам нужен какой-то объект блокировки:
private final Object lock = new Object();
Чтобы подождать на объекте, вам нужно удерживать блокировку, и условие должно проверяться в цикле while
.
synchronized (lock) {
while (!some_condition) {
lock.wait();
}
...
}
Чтобы уведомить, удерживайте блокировку, сообщите (вы также можете пойтидля notifyAll
это будет по крайней мере так же хорошо, как notify
, а иногда это может быть необходимо, но не попадется на тестирование) и изменит условие.
synchronized (lock) {
lock.notifyAll();
some_condition = true;
}
Кроме того, хорошей практикой является неподкласс Thread
.Идет и для других ненужных подклассов тоже.Обычно вы создаете Runnable
и передаете его конструктору.