Почему InterruptedException выбрано? [Дубликат]

Нет, к сожалению, вы не можете расширять типы, реализованные в C во время выполнения.

Вы можете подклассировать int, хотя это нетривиально, вам может потребоваться переопределить __new__.

У вас также есть проблема с синтаксисом:

1.somemethod()  # invalid

Однако

(1).__eq__(1)  # valid
91
задан 3 revs, 3 users 100% 14 January 2016 в 19:54
поделиться

6 ответов

Вы, как правило, НЕ игнорируете исключение. Взгляните на следующую статью:

Не проглатывайте прерывания

Иногда бросание InterruptedException не является параметром, например, когда задание, заданное Runnable, вызывает прерывистый метод , В этом случае вы не можете повторить InterruptedException, но вы также не хотите ничего делать. Когда метод блокировки обнаруживает прерывание и выбрасывает InterruptedException, он очищает прерванный статус. Если вы поймаете InterruptedException, но не можете его восстановить, вы должны сохранить доказательства того, что произошло прерывание, чтобы код выше в стеке вызовов мог узнать о прерывании и ответить на него, если захочет. Эта задача выполняется путем вызова функции interrupt () для «переинтерпретации» текущего потока, как показано в листинге 3. По крайней мере, всякий раз, когда вы улавливаете InterruptedException и не восстанавливаете его, повторно возвращайте текущий поток перед возвратом.

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-

29
ответ дан 3 revs, 3 users 78% 25 August 2018 в 21:39
поделиться

Методы, подобные sleep() и wait() класса Thread, могут вызвать InterruptedException. Это произойдет, если какой-либо другой thread хочет прервать thread, ожидающий или спящий.

0
ответ дан 2 revs, 2 users 67% 25 August 2018 в 21:39
поделиться

Если выбрано InterruptedException, это означает, что что-то хочет прервать (как правило, завершение) этого Thread. Это вызвано вызовом метода прерывания потоков (). Метод wait обнаруживает это и выдает исключение InterruptedException, поэтому код catch может немедленно обрабатывать запрос на завершение и не ждать до истечения указанного времени.

Если вы используете его в однопоточном приложении (а также в некоторых многопоточных приложениях) это исключение никогда не будет запущено. Игнорируя это, имея пустое предложение catch, я бы не рекомендовал. Бросок InterruptedException очищает прерванное состояние Thread, поэтому, если он не обрабатывается должным образом, информация теряется. Поэтому я бы предложил запустить:

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

, который устанавливает это состояние снова. После этого завершите выполнение. Это было бы правильное поведение, даже жесткое никогда не использовалось.

Что может быть лучше, добавить в блок catch команду:

} catch (InterruptedException e) {
  assert false;
}

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

26
ответ дан 2 revs, 2 users 97% 25 August 2018 в 21:39
поделиться

Информационный бюллетень Java Specialists (который я могу безоговорочно рекомендовать) имел интересную статью об этом и как обрабатывать InterruptedException. Это стоит прочитать и переварить.

10
ответ дан Brian Agnew 25 August 2018 в 21:39
поделиться

InterruptedException обычно вызывается, когда спящий режим прерывается.

-4
ответ дан BrutalOst 25 August 2018 в 21:39
поделиться

Твердый и простой способ справиться с этим в однопоточном коде - это поймать его и перетащить в RuntimeException, чтобы избежать необходимости объявлять его для каждого метода.

4
ответ дан starblue 25 August 2018 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: