Разница между ожиданиями () и сном () - PullRequest
1128 голосов
/ 24 июня 2009

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

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

Почему у нас есть и wait(), и sleep(): как их реализация меняется на более низком уровне?

Ответы [ 32 ]

11 голосов
/ 31 октября 2012

sleep - метод Thread, wait - метод Object, поэтому wait/notify - метод синхронизации общих данных в Java (с использованием monitor ), но sleep - это простой метод потоковой приостановки самого себя.

7 голосов
/ 23 декабря 2013

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

6 голосов
/ 24 июня 2009

wait и sleep методы очень разные:

  • sleep не имеет способа "пробуждения",
  • , тогда как wait имеет способ «пробуждения» в течение периода ожидания другим потоком, вызывающим notify или notifyAll .

Если подумать, имена в этом отношении сбивают с толку; однако sleep является стандартным именем, а wait аналогично WaitForSingleObject или WaitForMultipleObjects в Win API.

5 голосов
/ 19 марта 2015

Из этого поста: http://javaconceptoftheday.com/difference-between-wait-and-sleep-methods-in-java/

Метод wait ().

1) Поток, вызывающий метод wait (), снимает блокировку, которую он удерживает.

2) Поток восстанавливает блокировку после того, как другие потоки вызывают методы notify () или notifyAll () для той же блокировки.

3) метод wait () должен быть вызван в синхронизированном блоке.

4) метод wait () всегда вызывается для объектов.

5) Ожидание потоков может быть вызвано другими потоками путем вызова методов notify () или notifyAll ().

6) Чтобы вызвать метод wait (), поток должен иметь блокировку объекта.

sleep () Метод

1) Поток, который вызывает метод sleep (), не снимает блокировку, которую он удерживает.

2) метод sleep () может быть вызван внутри или снаружи синхронизированного блока.

3) метод sleep () всегда вызывается в потоках.

4) Спящие нитки не могут быть разбужены другими нитями. Если это так, поток выдаст исключение InterruptedException.

5) Для вызова метода sleep () поток не должен иметь объектную блокировку.

5 голосов
/ 24 июня 2009

Проще говоря, wait is wait До тех пор, пока какой-либо другой поток не вызовет вас, тогда как sleep будет "dont execute next Statement" в течение некоторого указанного периода времени.

Кроме того, sleep является статическим методом в классе Thread и работает с потоком, тогда как wait () находится в классе Object и вызывается для объекта.

Другой момент, когда вы вызываете wait для какого-либо объекта, вовлеченный поток синхронизирует объект и затем ждет. :)

4 голосов
/ 19 мая 2013

Одна потенциальная большая разница между сном / прерыванием и ожиданием / уведомлением состоит в том, что

Создание исключения, когда оно не нужно, неэффективно. Если у вас есть потоки, взаимодействующие друг с другом с высокой скоростью, то вы бы генерировали много исключений, если бы вы все время вызывали прерывание, что приводит к полной потере ЦП.

4 голосов
/ 09 сентября 2014
  1. wait() - метод класса Object.
    sleep() - это метод Thread класса.

  2. sleep() позволяет потоку перейти в состояние sleep за x миллисекунд.
    Когда поток переходит в состояние сна it doesn’t release the lock.

  3. wait() позволяет потоку снять блокировку и goes to suspended state.
    Этот поток будет активен, когда метод notify() или notifAll() называется для того же объекта.

3 голосов
/ 24 июня 2009

Вы правы - Sleep () приводит к тому, что поток «спит», и процессор отключается и обрабатывает другие потоки (иначе называемые переключением контекста), когда, я думаю, Wait заставляет процессор обрабатывать текущий поток.

У нас есть оба варианта, потому что, хотя может показаться разумным позволить другим людям использовать процессор, пока вы его не используете, на самом деле существуют издержки на переключение контекста - в зависимости от того, как долго длится сон, он может быть дороже в циклах ЦП переключать потоки, чем просто заставить ваш поток ничего не делать в течение нескольких мс.

Также обратите внимание, что сон вызывает переключение контекста.

Также - в общем случае невозможно управлять переключением контекста - во время ожидания ОС может (и будет дольше ждать) выбрать обработку других потоков.

3 голосов
/ 07 ноября 2014

wait снимает блокировку, а sleep - нет. Поток в состоянии ожидания может быть активирован, как только вызывается notify или notifyAll. Но в случае sleep поток сохраняет блокировку, и он будет иметь право только после окончания времени ожидания.

3 голосов
/ 11 мая 2013

Методы используются для разных вещей.

Thread.sleep(5000);   // Wait until the time has passed.

Object.wait();        // Wait until some other thread tells me to wake up.

Thread.sleep (n) можно прервать, но Object.wait () должен быть уведомлен. Можно указать максимальное время ожидания: Object.wait(5000), поэтому можно было бы использовать wait, например, sleep, но тогда вам придется беспокоиться о блокировках.

Ни один из методов не использует процессор во время сна / ожидания.

Методы реализованы с использованием собственного кода, с использованием аналогичных конструкций, но не одинаковым образом.

Ищите сами: Доступен ли исходный код нативных методов? Файл /src/share/vm/prims/jvm.cpp является отправной точкой ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...