Коли програма Thread.sleep Java кидає InterruptedException?


110

Коли програма Thread.sleep Java кидає InterruptedException? Чи безпечно це ігнорувати? Я не роблю жодної багатопотокової інформації. Я просто хочу почекати кілька секунд, перш ніж повторити деяку операцію.



1
Залежить, у якому сенсі ви маєте на увазі «ігнорувати». InterruptedExceptionце спіймано виняток, так що ви не можете скомпілювати , якщо не обробляти або оголошувати цей тип виключення на будь-якому методі , який приєднується або Спить Thread, чи виклики wait()на Object.
8bitjunkie

Відповіді:


41

Як правило, НЕ ігноруйте виняток. Погляньте на наступний документ:

Не ковтайте переривання

Іноді кидання InterruptException - це не варіант, наприклад, коли завдання, визначене Runnable, викликає метод переривання. У цьому випадку ви не можете повторно скинути InterruptedException, але ви також не хочете нічого робити. Коли метод блокування виявляє переривання та видаляє InterruptedException, він очищає статус перерваного. Якщо ви ловите InterruptException, але не можете його повторно скинути, вам слід зберегти докази того, що перерва сталася, щоб код вище в стеку виклику міг дізнатися про перерву та відповісти на нього, якщо він цього хоче. Це завдання виконується за допомогою виклику interrupt () для "повторного переривання" поточного потоку, як показано у Лістингу 3. Щонайменше, кожного разу, коли ви ловите InterruptException і не перезаписуєте його, повторно переривайте поточний потік перед поверненням.

public class TaskRunner implements Runnable {
    private BlockingQueue<Task> queue;

    public TaskRunner(BlockingQueue<Task> queue) { 
        this.queue = queue; 
    }

    public void run() { 
        try {
             while (true) {
                 Task task = queue.take(10, TimeUnit.SECONDS);
                 task.execute();
             }
         }
         catch (InterruptedException e) { 
             // Restore the interrupted status
             Thread.currentThread().interrupt();
         }
    }
}

Весь документ дивіться тут:

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-


38

Якщо " InterruptedExceptionкинуто", це означає, що щось хоче перервати (зазвичай припинити) цю нитку. Це ініціюється викликом interrupt()методу потоків . Метод очікування виявляє це і видає InterruptedExceptionтак, що код уловки може негайно обробити запит на припинення, і не потрібно чекати, поки закінчиться вказаний час.

Якщо ви використовуєте його в однопотоковому додатку (а також у деяких багатопотокових програмах), це виключення ніколи не буде запущено. Ігнорувати це, маючи порожній пункт про вилов, я б не рекомендував. Закидання InterruptedExceptionочищає перерваний стан потоку, тому, якщо не обробляється належним чином, інформація втрачається. Тому я б запропонував запустити:

} catch (InterruptedException e) {
  Thread.currentThread().interrupt();
  // code for stopping current task so thread stops
}

Що знову встановлює цей стан. Після цього закінчіть виконання. Це була б правильна поведінка, навіть жорстка ніколи не використовується.

Що може бути краще, це додати:

} catch (InterruptedException e) {
  throw new RuntimeException("Unexpected interrupt", e);
}

... заява до блоку лову. Це в основному означає, що це ніколи не повинно відбуватися. Тож якщо код буде повторно використаний у середовищі, де це може статися, він скаржиться на нього.


5
Твердження на Java за замовчуванням вимкнено . Тож краще просто кинути RuntimeException.
Євгеній Сергєєв


5

Такі методи, як sleep()і wait()клас, Threadможуть кинути InterruptedException. Це станеться, якщо хтось інший threadзахотів перервати те, threadщо чекає або спить.


3

Надійним і простим способом обробити його в одному потоковому коді було б схопити його і повторно запустити в RuntimeException, щоб уникнути необхідності оголошувати його для кожного методу.


-7

InterruptedExceptionЗазвичай створюється , коли сон переривається.


13
Це неправильно, оскільки не сплячий не сам сон, а Нитка, що його виконує. Перерваний - це стан потоку. Це просто призводить до того, що метод сну припиняється.
ubuntudroid
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.