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.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Приостановка Выполнения со Сном
Следующая страница: Соединения