Java Разница между wait() и sleep()

В чем разница между wait() и sleep() в потоках?

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

Почему у нас есть как wait(), так и sleep()?

Я конечно не сильно изучал Java, но оба эти метода должны работать аналогично и в С#, поэтому могу сказать следующее:
wait - усыпляет определённый поток, при этом позволяет разбудить его из других частей Вашей программы
sleep же просто усыпляет поток и он станет активным только после истечении указанного в нём времени (разбудить его вручную нельзя)

из выше приведённого можно сделать вывод, что wait зачастую используется при синхронизации нескольких потоков, а sleep только для различных рода задержек

сама идея правильна!

wait может быть "пробуждено" другим потоком, вызывающим notify на мониторе, который ожидает, тогда как sleep не может. Также waitnotify) должны находиться в блоке synchronized на объекте монитора, а sleep не обязательно:

Object mon = ...;
synchronized (mon) {
    mon.wait();
} 

Где-то в другом участке кода:

synchronized (mon) {
     mon.notify(); 
}

это тот же самый объект mon

Другой момент заключается в том, что wait вызывается для самого Object (т.е. вы ждете на мониторе объекта), тогда как sleep вызывается для определённого потока!

Еще один момент заключается в том, что вы можете получить ложные пробуждения от wait (то есть ожидающий поток возобновляется без видимой причины). Поэтому всегда рекомендуется wait поместить ещё в какой-то цикл с условием:

synchronized {
    while (!condition) {
        mon.wait(); 
    }
}
2 Вподобання