Я читаю Goetz's Java Concurrency In Practice, где показан этот пример код:Является ли этот пример кода просто поспешным или будет ли причина здесь использовать прерывание()
public final class Indexer implements Runnable {
private final BlockingQueue<File> queue;
public Indexer(BlockingQueue<File> queue) {
this.queue = queue;
}
@Override
public void run() {
try {
while (true) {
queue.take();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
с описанием:
Восстановите прерывание. Иногда вы не можете выбрасывать InterruptedException, например, когда ваш код является частью Runnable. В этих ситуациях вы должны поймать InterruptedException и восстановить прерванный статус, вызвав прерывание по текущему потоку , чтобы код выше стека вызовов мог видеть, что было выпущено прерывание , как показано в листинге 5.10.
В примере кода «код выше стека вызовов» никогда не будет видеть прерывание, если этот код выполнен - или я делаю неправильный вывод? Поток здесь просто умирает после звонка interrupt()
, правильно?
Таким образом, единственный способ, которым этот interrupt()
может быть полезен, если он находится внутри цикла, правильно?
Я не на 100% уверен, что вы пытаетесь сказать. OP явно предполагает, что любой экземпляр данного класса «Indexer» будет делегатом «Thread», и в этом случае не будет «кода выше стека вызовов». Кажется, вы говорите: «Не думайте об этом! Вы не знаете, кто называет этот метод' run() '. Я прав? –
Это правильно. Это может быть так, что отношение индексатора к потоку равно 1-1.То, что я делаю (подобно Goetz), состоит в том, что это может быть не так, и если это может быть не так, всегда следует распространять прерывание. –
Немного абразивно сказать, что я думал 'Thread # stop()'. У «Runnable» просто заканчивается код, который запускается после блока «try-catch». Не могли бы вы привести пример кода, чтобы продемонстрировать, что вы подразумеваете под «Thread», отвечая на какой-либо другой запрос на отмену? Или, по крайней мере, расширить идею? – Adam