Управление InterruptedException

Я прочитал 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? что происходит дальше? немного потерялся в этом .. какой-нибудь вклад?

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


person seesee    schedule 09.08.2011    source источник


Ответы (2)


Здесь важен код, которого нет в примере. Метод в примере (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, тогда прерывание теряется, и фрагмент кода, который я написал выше, никогда не прекратит цикл.

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

person toto2    schedule 09.08.2011
comment
oic, но если в приложении нет кода, который останавливается по прерыванию, нам не стоит об этом беспокоиться? - person seesee; 10.08.2011
comment
Ну да... но в любом случае лучше установить прерывание, потому что в какой-то момент вы можете повторно использовать свой код для чего-то другого, и будет очень сложно понять, почему какой-то поток не может быть прерван. - person toto2; 11.08.2011

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

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

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

person JimmyB    schedule 27.10.2011