Рекомендуем, 2024

Выбор редакции

Разница между сном () и методом ожидания () в Java

Метод сна и ожидания звучит как выполнение одной и той же задачи, но они сильно отличаются друг от друга. Спящий метод принадлежит классу Thread, а метод wait принадлежит классу Object. Самое важное различие, которое отличает их обоих, заключается в том, что метод sleep удерживает блокировку объекта до тех пор, пока он не будет прерван или не завершит свое выполнение. С другой стороны, метод wait снимает блокировку на объекте, чтобы позволить другим объектам выполняться, пока метод notify не будет возобновлен. Есть еще несколько различий между сном и методом ожидания; Вы можете изучить их в сравнительной таблице, приведенной ниже.

Сравнительная таблица

Основа для сравненияспатьПодождите
основнойСпящий метод не снимает блокировку с объекта, пока он не будет прерван.Метод wait снимает блокировку на объекте, чтобы позволить другим объектам выполняться до вызова метода notify или notifyAll.
Учебный классСпящий метод определен в классе Thread.Метод ожидания определяется в классе Object.
синхронизированныйСпящий метод не нужно вызывать в синхронизированном контексте.Метод ожидания должен быть вызван в контексте синхронизации.
завершениеВыполнение неактивного метода завершается, когда поток прерывает его или истекает время неактивного метода.Выполнение метода ожидания завершается, когда метод notify () или notifyAll () прерывает его.
статическийМетод сна является статическим методом.Метод wait не является статичным, поэтому для его вызова необходим объект.
выполнениеСпящий метод выполняется в текущем потоке.Метод ожидания выполняется на объекте.
исключениеInterruptedExceptionIllegalArgumentException, IllegalMonitorStateException, InterruptedException.

Определение метода сна

Метод sleep является статическим методом класса Thread . Метод sleep вызывается, когда поток не хочет выполнять какую-либо задачу в течение определенного промежутка времени. Спящий метод завершает свое выполнение либо по истечении времени метода, либо он прерывается каким-либо другим потоком при выполнении. После того, как метод сна завершен, поток снова получает свой работоспособный статус. Есть два метода сна, как показано ниже.

 public static native void sleep (длинная миллисекунда); общедоступный статический недействительный сон (длинные миллисекунды и int наносекунды); 

В приведенных выше двух формах вы можете наблюдать, как упоминается время, как в форме сна. Это связано с тем, что поток всегда спит в течение определенного времени, указанного в параметре. Спящий метод может быть прерван любым другим потоком во время его выполнения; следовательно, он может бросить InterruptedExecption. Вы должны позаботиться о том, чтобы исключение обрабатывалось либо блоком try / catch, либо ключевыми словами Throws, иначе это приведет к ошибке времени компиляции. Метод sleep удерживает блокировку текущего объекта в процессе выполнения и не позволяет другим объектам выполняться до тех пор, пока он не завершит свое выполнение.

Определение метода ожидания

Wait - это метод, определенный в классе Object . Метод ожидания используется, когда несколько задач (потоков) борются за один и тот же ресурс по одной. Метод wait при вызове освобождает блокировку объекта, который вызвал метод wait. И предоставить возможность другому объекту выполняться до тех пор, пока не будет вызван метод notify, который дополнительно возобновит блокировку объекта, освобожденного методом wait. Метод ожидания имеет следующую форму.

 Подождите(); ждать (долгая миллисекунда); wait (длинная миллисекунда, int наносекунда); 

Как и в вышеупомянутых трех формах метода ожидания, первый метод не имеет параметра времени, это означает, что выполнение метода ожидания будет продолжаться до тех пор, пока метод notify или notifyAll не будет вызван. Остальные два метода имеют временные параметры. Таким образом, они будут выполняться до истечения времени или до тех пор, пока метод notify или noitfyAll не будет вызван раньше, чем истечет время. Метод wait может генерировать исключения. IllegalArgumentException, если переданный аргумент времени является отрицательным. IllegalMonitorStateException, если текущий поток не использует ресурс. InterruptedException, если метод ожидания прерывается.

Ключевые различия между методом сна и ожидания в Java

  1. Основным отличием метода sleep и wait является то, что метод sleep удерживает блокировку объекта до тех пор, пока он не будет прерван или не истечет его время. Однако метод wait снимает блокировку с объекта, который его вызывает, и дает другим объектам возможность выполнить.
  2. Метод sleep определен в классе Thread, тогда как метод wait определен в классе Object .
  3. Спящий метод не нужно вызывать из синхронизированного контекста. Но метод wait нужно вызывать из синхронизированного.
  4. Спящий метод активируется, если время метода истекло или оно прервано другим потоком. Метод ожидания пробужден
    когда вызывается метод notify или notify All.
  5. Метод sleep является статическим методом, тогда как метод wait не является статическим методом.
  6. Метод sleep выполняется в текущем потоке, тогда как метод wait выполняется в объекте, который его вызывает.
  7. Исключением, вызванным методом сна, является InterruptedException, тогда как исключениями, вызванными методом ожидания, являются IllegalArgumentException, IllegalMonitorStateException, InterruptedException .

Заключение:

Когда несколько потоков хотят использовать один и тот же ресурс один за другим, должен использоваться метод wait. Если поток не хочет выполнять какую-либо задачу, необходимо использовать метод сна.

Top