Управление InterruptedException - PullRequest
       8

Управление InterruptedException

0 голосов
/ 10 августа 2011

Я прочитал http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html

Я решаю сделать мою блокировку невыполнимой с помощью

try {
    lockedRecords.wait();
} catch (InterruptedException e) {
    interrupted = true;
}

но есть ли необходимость

} finally {
    if (interrupted) {
        Thread.currentThread().interrupt();
    }
}

В статье говорится, что вы должны вызывать interrupt (), чтобы сохранить статус прерывания. Я все еще очень размыт, так что если я установлю .interrupt? что происходит дальше? немного потерял на этом .. любой вход?

Какое значение это имеет для моей программы? Пожалуйста, объясните в терминах непрофессионала, с благодарностью: D

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Здесь важен код, который не написан в примере. Метод в примере (getNextTask) может быть использован в:

while (!Thread.interrupted()) {
   Task task = getNextTask(queue);  
   doSomething(task);
}
System.out.println("The thread was interrupted while processing tasks.");
System.out.println("...stopped processing.");

Указанный выше цикл while выполняется вечно, если только кто-то не прерывает поток, в котором выполняется этот цикл.

Если состояние прерывания не сбрасывается, как это делается в getNextTask, однако, когда кто-то пытается прервать поток, когда поток находится в queue.take в getNextTask, тогда прерывание теряется и бит кода I написанное выше никогда не остановит зацикливание.

Весь смысл примера на веб-странице IBM заключается в том, что вы должны быть очень осторожны при проглатывании прерывания, поскольку это может случайно сделать невозможным прерывание потока.

0 голосов
/ 27 октября 2011

Просто проглотить InterruptedException хорошо, если вы знаете, что текущий поток завершится после того, как ваша задача будет выполнена, и вернется.

Могут возникнуть проблемы при использовании некоторого пула потоков, например ExecutorService, где обычно потоки продолжают работать после завершения задачи, ожидая, пока следующая задача придет. В этом случае объединенный поток должен быть уведомлен о том, что был прерван, чтобы он мог делать все, что подходит в этой ситуации, например, выполнить чистое отключение и выйти.

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

...