Я читал, что вы должны помещать вызовы Object.wait() в Java в цикле while. Причина в том, что этот поток может быть разбужен, и условие, которое вы ожидали оповестить, по-прежнему ложно (ложное пробуждение).
Как насчет Object.wait(long timeout). Здесь вы не хотите зацикливаться на этом состоянии, так как вы хотите, чтобы он отключился после указанного количества времени. Но если вы не поместите его в цикл, то как вы можете убедиться, что он не будет разбужен раньше?