2016-04-07 3 views
2

У меня есть код, подобный этому, который находится внутри run() метода Runnable и нескольких экземпляров этого Runnable запускается,Как обрабатывать InterruptedException BlockingQueue?

do{ 
     try{ 
      String contractNum=contractNums.take(); 
      }catch(InterruptedException e){ 
      logger.error(e.getMessage(), e); 
     } 
    }while(!("*".equals(contractNum))); 

Где contractNums является BlockingQueue<String> совместно несколько потоков. В этой очереди есть отдельные Runnables.

Я не уверен, что последующие шаги после ловли InterruptedException, я должен прекратить эту нить, повторно бросает RuntimeException (так моя while цикл завершается) или попытаться взять следующий элемент из contractNum queue снова и игнорируя InterruptedException?

Я не уверен, что InterruptedException следует рассматривать как фатальное условие для прерывания потока или сохранения его во время цикла.

Просьба предложить.

ответ

1

зависит от цели. Есть ли места, где вы намеренно прерываете поток, например, чтобы сказать, что он закончил (например, во время выключения)? Если нет, вам просто нужно обработать возможные ложные прерывания, которые пробудят поток. Если вы не хотите, чтобы обработка была затронута, просто игнорируйте их. Они абсолютно не соответствуют фатальным исключениям, и вам не нужно их регистрировать (особенно в качестве ошибок).

+0

Спасибо. Нет, нет намеренных прерываний. –

+0

Тогда вам не нужно предпринимать никаких специальных действий. – Kayaman

3

7.1.2 Прерывание политики

Так же, как задачи должны иметь политику отмены, нити должны политику прерывания. Политика прерывания определяет, как поток интерпретирует запрос прерывания - что он делает (если есть), когда обнаружен один , какие единицы работы считаются атомными по отношению к прерыванию и как быстро он реагирует на прерывание. Самая разумная политика прерывания - это некоторая форма уровня нити или обслуживания - уровень отмены: выйдите так же быстро, как и в случае необходимости, очистите, если необходимо, и, возможно, уведомив некоторую собственную сущность, что поток уходит. Можно установить другие политики прерывания: , такие как приостановка или возобновление службы, но потоки или пулы потоков с нестандартными политиками прерывания, возможно, должны быть ограничены задачами, которые были написаны с пониманием политики.

7.1.3 В ответ на прерыванию

Как упоминалось Befor, при вызове прерываемый метод блокирования , такие как Thread.sleep или BlockingQueue.put, есть два практических стратегии обработки InterruptedException:

• Пропагандируйте исключение (возможно, после некоторой очистки по конкретным задачам), , что делает ваш метод прерывистым методом блокировки; или

• Восстановить статус прерывания, чтобы код выше по вызову стек мог справиться с этим.

Java Concurrency in Practice Глава 7.

Конкретно в вашем коде, вам нужно будет убедиться, что если поток прерывается ваша логика приложения не нарушена. И действительно лучше поймать исключение прерывания. Что с этим нужно, просто попробуйте убедиться, что вы не нарушаете логику приложения.

+2

Спасибо за цитирование этой книги. На странице 143 - 144 описан мой сценарий и предлагается, что мне нужно вызвать 'Thread.currentThread.interrupt()' только один раз во внешнем блоке 'finally', когда поток вот-вот закончится - независимо от количества раз это исключение бросается. Во внутреннем улове я должен игнорировать исключение и повторять попытку 'take()' элементов из очереди. –