sleep () - это метод, который используется для удержания процесса в течение нескольких секунд или нужного времени, но в случае метода wait () поток переходит в состояние ожидания и не возвращается автоматически, пока мы не вызовем notify () или notifyAll ().
Главное отличие состоит в том, что wait () снимает блокировку или монитор, в то время как sleep () не снимает блокировку или монитор во время ожидания. Ожидание используется для связи между потоками, в то время как ожидание используется, чтобы, как правило, вводить паузу при выполнении.
Thread.sleep () отправляет текущий поток в состояние «Not Runnable» на некоторое время. Поток сохраняет мониторы, которые он получил, т.е. если поток в настоящее время находится в синхронизированном блоке или методе, никакой другой поток не может войти в этот блок или метод. Если другой поток вызывает t.interrupt (), он разбудит спящий поток. Обратите внимание, что sleep - это статический метод, который означает, что он всегда влияет на текущий поток (тот, который выполняет метод sleep). Распространенной ошибкой является вызов t.sleep (), где t - другой поток; даже тогда, это текущий поток, который будет спать, а не поток t.
object.wait () отправляет текущий поток в состояние «Not Runnable», как sleep (), но с поворотом. Ожидание вызывается для объекта, а не для потока; мы называем этот объект «объект блокировки». Перед вызовом lock.wait () текущий поток должен синхронизироваться с объектом блокировки; Затем wait () снимает эту блокировку и добавляет поток в «список ожидания», связанный с блокировкой. Позже другой поток может синхронизироваться с тем же объектом блокировки и вызывать lock.notify (). Это пробуждает оригинальную ожидающую нить. По сути, wait () / notify () похожа на sleep () / interrupt (), только активному потоку не нужен прямой указатель на спящий поток, а только на объект общей блокировки.
synchronized(LOCK) {
Thread.sleep(1000); // LOCK is held
}
synchronized(LOCK) {
LOCK.wait(); // LOCK is not held
}
Позвольте классифицировать все вышеперечисленные пункты:
Call on:
- wait (): вызов объекта; текущий поток должен синхронизироваться на объекте блокировки.
- sleep (): Вызов на тему; всегда выполняющий поток.
Synchronized:
- wait (): , когда синхронизированные несколько потоков обращаются к одному и тому же объекту один за другим.
- sleep (): когда синхронизированные несколько потоков ожидают ожидания из спящего потока.
Hold lock:
- wait (): снять блокировку для других объектов для возможности выполнения.
- sleep (): сохранять блокировку не менее t раз, если указан тайм-аут или кто-то прервал.
Wake-up condition:
- wait (): до вызова notify (), notifyAll () из объекта
- sleep (): до тех пор, пока не истечет хотя бы время или прерывание вызова ().
Usage:
- sleep (): для синхронизации времени и;
- wait (): для многопоточной синхронизации.
Ссылка: diff sleep
и wait