Короткий ответ
wait() — метод класса Object, а sleep() — статический метод класса Thread. wait() служит для межпоточной коммуникации, вызывается только из синхронизированного кода и при вызове освобождает монитор объекта. sleep() просто приостанавливает текущий поток на заданное время и не освобождает удерживаемые блокировки.
Как это работает подробнее
wait() вне синхронизированного метода или блока бросит IllegalMonitorStateException. Поток переходит в ожидание, пока другой поток не вызовет notify()/notifyAll() на том же объекте либо не истечёт указанный таймаут; без таймаута ожидание может длиться «вечно».
sleep() можно вызывать где угодно, он всегда принимает время задержки и удобен для имитации пауз. Пара wait()/notify() — классический механизм схемы «производитель — потребитель» для ожидания наступления условия.
- Оба метода бросают проверяемое
InterruptedException, которое нужно обрабатывать.
Пример кода
void demo() throws InterruptedException {
Object lock = new Object();
synchronized (lock) {
lock.wait(1000); // освобождает монитор lock и ждёт до 1 c
}
Thread.sleep(1000); // пауза; мониторы при этом удержаны
}Что использовать на практике
- Используй
wait()/notifyAll(), когда поток должен ждать наступления условия (схема «производитель — потребитель»). - Используй
sleep()только для пауз и имитации задержек, а не для координации потоков. - Вместо низкоуровневых
wait()/notify()предпочитай готовые блокирующие очереди и пулы из java.util.concurrent.