Spec-Zone .ru
спецификации, руководства, описания, API
|
Прерывание является индикацией потоку, что оно должно остановить то, что оно делает, и сделайте что-то еще. Это до программиста, чтобы решить точно, как поток отвечает на прерывание, но потоку очень свойственно завершиться. Это - использование, подчеркнутое в этом уроке.
Поток отправляет прерывание, вызывая interrupt
на Thread
объект для потока, который будет прерван. Для механизма прерывания, чтобы работать правильно, прерванный поток должен поддерживать свое собственное прерывание.
Как поток поддерживает свое собственное прерывание? Это зависит от того, что это в настоящий момент делает. Если поток часто вызывает методы тот бросок InterruptedException
, это просто возвращается из run
метод после того, как это ловит то исключение. Например, предположите центральный цикл сообщения в SleepMessages
пример был в run
метод потока Runnable
объект. Затем это могло бы быть изменено следующим образом, чтобы поддерживать прерывания:
for (int i = 0; i < importantInfo.length; i++) { // Pause for 4 seconds try { Thread.sleep(4000); } catch (InterruptedException e) { // We've been interrupted: no more messages. return; } // Print a message System.out.println(importantInfo[i]); }
Много методов тот бросок InterruptedException
, такой как sleep
, разрабатываются, чтобы отменить их текущую работу и сразу возвратиться, когда прерывание получается.
Что, если поток идет длительное время, не вызывая метод, который бросает InterruptedException
? Затем это должно периодически вызывать Thread.interrupted
, который возвращается true
если прерывание было получено. Например:
for (int i = 0; i < inputs.length; i++) { heavyCrunch(inputs[i]); if (Thread.interrupted()) { // We've been interrupted: no more crunching. return; } }
В этом простом примере код просто тестирует на прерывание и выходит из потока, если Вы были приняты. В более сложных приложениях могло бы иметь больше смысла бросать InterruptedException
:
if (Thread.interrupted()) { throw new InterruptedException(); }
Это позволяет коду обработки прерываний быть централизованным в a catch
пункт.
Механизм прерывания реализуется, используя внутренний флаг, известный как состояние прерывания. Вызов Thread.interrupt
наборы этот флаг. Когда поток проверяет на прерывание, вызывая статический метод Thread.interrupted
, состояние прерывания очищается. Непомехи isInterrupted
метод, который используется одним потоком, чтобы запросить состояние прерывания другого, не изменяет флаг состояния прерывания.
Условно, любой метод, который выходит, бросая InterruptedException
очищает состояние прерывания, когда оно делает так. Однако, всегда возможно, что состояние прерывания будет сразу установлено снова другим вызовом потока interrupt
.