Чем отличаются методы wait () и sleep () в Java?

Методы wait() и sleep() в Java предоставляют различные механизмы управления потоками, и их использование зависит от конкретных потребностей приложения.

  1. wait():
  • Метод wait() является частью механизма синхронизации в Java и вызывается на объекте. Он используется для временного приостановления выполнения потока и освобождения монитора объекта, на котором он вызывается.
  • При вызове метода wait() поток переходит в состояние ожидания до тех пор, пока другой поток не вызовет метод notify() или notifyAll() на том же объекте, после чего поток возобновляет свою работу.
  • wait() должен быть вызван внутри синхронизированного блока или метода, иначе будет выброшено исключение IllegalMonitorStateException.
  1. sleep():
  • Метод sleep() вызывается на потоке и используется для приостановки выполнения потока на заданное количество миллисекунд.
  • При вызове метода sleep() поток блокируется на указанное время и затем возобновляет выполнение.
  • В отличие от wait(), sleep() не освобождает монитор, поэтому другие потоки не могут получить доступ к тому же монитору во время выполнения sleep().

Вот примеры использования каждого из методов:

// Использование wait()
synchronized (someObject) {
    try {
        someObject.wait(); // Поток ждет уведомления
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

// Использование sleep()
try {
    Thread.sleep(1000); // Поток приостанавливается на 1 секунду
} catch (InterruptedException e) {
    e.printStackTrace();
}

В общем, wait() и sleep() используются для разных целей: wait() для синхронизации и ожидания уведомлений от других потоков, а sleep() для временной задержки выполнения потока.