Хобрук: Ваш путь к мастерству в программировании

Прерывание потока во время его выполнения; каковы последствия следующего прерывания?

Предположим, что поток t1 работает (т. е. не находится в состоянии сна, ожидания или присоединения). Другой поток t2 прерывает t1. Javadoc говорит, что будет установлен статус прерывания t1.

Предположим, что t1 засыпает, ждет или присоединится к статусу позже. Что просходит?

i) Поток t1 автоматически поднимается с InterruptedException, так как он был прерван?

Предположим, что t1 все еще находится в состоянии сна, ожидания или присоединения. Давайте представим, что t2 снова прерывает t1:

ii) Поток t1 инициирован с помощью InterruptedExecution или ему нужно сначала очистить свой статус прерывания с помощью вызова interrupted()?

Есть ли официальная позиция Java по этому поводу? Спасибо.


Ответы:


1

В первом случае («i»), да, спящий поток будет вытолкнут из своего вызова Thread#sleep() посредством выбрасывания InterruptedException. На этом этапе флаг состояния потока представлен Thread#isInterrupted() будет очищен; вызов Thread#isInterrupted() вернет false. Поскольку InterruptedException находится в полете, сообщение было отправлено всем транзитивным вызывающим абонентам.

Затем вызывающая сторона несет ответственность за перехват этого исключения и выполнение одного из двух действий:

  • либо выйти из текущего потока, либо
  • вызовите Thread#interrupt() в текущий поток (то есть Thread.currentThread().interrupt())

Когда вы говорите, что поток «t1» «все еще находится в состоянии сна, ожидания или присоединения», единственный способ, которым это может быть после его первоначального вызова Thread#sleep(), завершенного через InterruptedException, — это если он поймал исключение, проигнорировал его и вызвал снова использовать какой-либо метод блокировки, например Thread.sleep(), прежде чем поток "t2" сможет прервать его во второй раз.

Если поток "t2" снова прервет поток "t1", в то время как "t1" в настоящее время заблокирован вызовом прерываемого метода, вызов "t1" снова завершится с InterruptedException. В противном случае будет установлен флаг прерывания потока для последующего обнаружения.

Каждый раз, когда вызывается Thread#interrupt(), статус прерывания этого целевого потока будет установлен на «истина», что означает, что поток был прерван с момента последнего сброса его статуса прерывания. В следующий раз, когда прерванный поток попытается выполнить блокирующий вызов прерываемого метода, статус прерывания потока будет очищен, и метод выдаст InterruptedException.

Обратите внимание, что сброс статуса прерывания подобным образом не приводит к потере информации, если сразу после сброса выдается InterruptedException. Выброшенный InterruptedException лучше всего интерпретировать как «У этого потока был установлен статус прерывания в какой-то момент ранее, и теперь вы обязаны реагировать и, как правило, предупреждать последующие вызывающие объекты о предполагаемом прерывании». Вы достигаете последней цели, вызывая Thread#interrupt() после перехвата InterruptedException, восстанавливая статус прерывания для просмотра другими.

Более подробное описание этого протокола см. в книге Java Concurrency in Practice.

24.11.2011

2

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

24.11.2011
Новые материалы

Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

Как интегрировать модель машинного обучения на ios с помощью CoreMl
С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

Создание успешной организации по науке о данных
"Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

Технологии и проблемы будущей работы
Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

Игорь Минар из Google приедет на #ReactiveConf2017
Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

Я собираюсь научить вас Python шаг за шагом
Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..