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

Вибір Редакції

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

Метод сну і очікування звучить як виконання тієї ж задачі, але вони значно відрізняються один від одного. Метод сну відноситься до класу Thread, а метод очікування належить до класу Object. Найбільш важливою відмінністю, яка відрізняє обидві з них, є метод sleep, який блокує об'єкт, поки він не перерветься або закінчить його виконання. З іншого боку, метод очікування звільняє блокування об'єкта, щоб дозволити іншим об'єктам виконувати до тих пір, поки не буде відновлено метод повідомлення. Є ще кілька відмінностей між методом сну і очікування; Ви можете вивчити їх на діаграмі порівняння, показаній нижче.

Діаграма порівняння

Основа для порівняннясончекати
ОсновнийМетод сну не відпускає блокування об'єкта, поки він не перерветься.Метод Wait випускає блокування об'єкта, щоб дозволити іншим об'єктам виконувати до сповіщення або виклику методу notifyAll.
КласМетод сну визначається у класі Thread.Метод очікування визначається в класі Object.
СинхронізованоМетод сну не потрібно викликати в межах синхронізованого контексту.Метод очікування повинен викликатися в контексті синхронізації.
ЗавершенняВиконання методу сну завершується, коли потік перериває його або закінчується час сну.Виконання методу очікування завершується, коли метод notify () або notifyAll () перериває його.
СтатичнийМетод сну - статичний метод.Метод очікування не є статичним, тому його потрібно викликати об'єктом.
ВиконанняМетод sleep виконується на поточному потоці.На об'єкті виконується метод очікування.
ВинятокInterruptedExceptionIllegalArgumentException, IllegalMonitorStateException, InterruptedException.

Визначення методу сну

Метод sleep є статичним методом класу Thread . Метод sleep викликається, коли потік не хоче виконувати будь-яке завдання протягом певного часу. Метод sleep завершує виконання, коли термін дії методу закінчується, або його перериває інший потік у виконанні. Після того, як метод сну завершиться, потік знову набуде свого стану виконання. Існує два способи сну, як показано нижче.

 відкритий статичний рідний сплячий режим (довгий мілісекунд); загальний статичний недійсний сон (довгі мілісекунди і int наносекунди); 

У зазначених вище двох формах можна спостерігати час, згадане в обох формах методу сну. Це пояснюється тим, що потік завжди спить протягом певного часу, зазначеного в параметрі. Спосіб сну може бути перерваний будь-яким іншим потоком під час його виконання; отже, він може викинути InterruptedExecption. Ви повинні подбати про те, щоб виняток оброблявся блоком try / catch або ключовими словами Throws, інакше це призведе до помилки часу компіляції. Метод sleep утримує блокування поточного об'єкта у виконанні і не дозволяє виконувати будь-який інший об'єкт до завершення його виконання.

Визначення методу очікування

Wait - це метод, визначений у класі Object . Метод очікування використовується, коли декілька завдань (потоків) борються за один і той же ресурс по одному. Метод очікування, коли він викликається, вивільняє блокування об'єкта, який викликав метод очікування. І надайте можливість іншому об'єкту виконати виконання до виклику методу notify, який додатково відновить блокування об'єкта, що видається методом очікування. Метод очікування має такий вигляд.

 wait (); очікування (довга мілісекунда); wait (довга мілісекунда, int наносекунда); 

Як і в трьох вищевказаних формах методу очікування, перший метод не має часового параметра, тобто виконання методу очікування продовжуватиметься, поки не буде викликаний метод notify або notifyAll. Решта два методи мають тимчасові параметри. Таким чином, вони будуть виконуватися до закінчення часу або до того, як сповіщати або noitfyAll метод викликається раніше, ніж закінчиться час. Метод очікування може кидати винятки. IllegalArgumentException, якщо переданий аргумент часу негативний. IllegalMonitorStateException, якщо поточний потік не використовує ресурс. InterruptedException, якщо метод очікування перерваний.

Ключові відмінності між методом сну та очікування в Java

  1. Основний момент, який відрізняє метод сну і очікування, полягає в тому, що метод сну утримує замок на об'єкті, поки він не переривається або час його закінчення. Тим не менш, метод очікування вивільняє блокування об'єкта, який викликає його, і надає іншим об'єктам можливість виконання.
  2. Метод sleep визначається у класі Thread, тоді як метод wait задається в класі Object .
  3. Метод sleep не потрібно викликати з синхронізованого контексту. Але метод очікування має бути викликаний з синхронізації.
  4. Метод sleep пробуджується, якщо час методу закінчився, або його перериває інший потік. Метод очікування пробуджується
    коли викликається метод notify або notify all.
  5. Метод сну є статичним методом, тоді як метод очікування не є статичним методом.
  6. Метод sleep виконується на поточному потоці, тоді як метод очікування виконується на об'єкті, який викликає його.
  7. Виняток, що викидається методом sleep, - це InterruptedException, тоді як виняток thrwon методом wait - це IllegalArgumentException, IllegalMonitorStateException, InterruptedException .

Висновок:

Якщо кілька потоків хоче використовувати один і той самий ресурс один за одним, то слід використовувати метод очікування. Коли потік не хоче виконувати будь-яке завдання, слід використовувати метод sleep.

Top