2016-04-01 7 views
3

Должен ли мы установить прерванный флаг при ловле InterruptedException внутри задачи, управляемой ExecutorService? Или мы просто проглотим InterruptedException?InterruptedException внутри ExecutorService

Пример:

final ExecutorService service = ...; 
final Object   object = ...; 

service.submit(() -> { 
    try { 
     while (!condition) { 
      object.wait(); 
     } 
    } catch (final InterruptedException exception) { 
     Thread.currentThread().interrupt(); // yes or no? 
    } 
}); 
+4

Это зависит от контекста и требований. Правило большого пальца, не проглатывайте, если вы не знаете, что делаете, и имеете веские причины. –

+1

Внутри «ExecutorService», в чем разница между размахом и не сглаживанием исключения? Как работает «Исполнитель» в обоих случаях? –

ответ

2

В задаче, переданной ExecutorService, получение прерывания является сигналом для отмены выполнения задачи. Итак, в вашем примере кода ответ «нет», не устанавливайте прерывание снова.

Повторное утверждение статуса прерывания, насколько я могу видеть в исходном коде, будет проигнорировано, но это немного путает работу с исполнителем, так как InterruptedException возникает сразу же, если рабочий поток пытается получить другая задача, которая затем определяется как ложная и очищенная в зависимости от состояния исполнителя.

Завершение работы исполнителя своевременно зависит от задач, выходящих в ответ на прерывание; это не зависит от задач, восстанавливающих статус прерывания.

+0

Обратите внимание, что 'InterruptedException' происходит не только тогда, когда исполнитель запрашивается' .shutdown() '. Это также происходит, если соответствующее 'Future ' запрашивается '.cancel (true)'. Будет ли «ExecutorService» также вести себя одинаково в обоих случаях (глотание или нет)? –

+0

@JasarTolio Да, он ведет себя одинаково. Я говорил в основном о вызовах Future.cancel() в моем ответе; резкое выключение можно считать запросом 'cancel()' для любых поставленных задач. Единственный эффект прерывания в рабочем потоке «ThreadPoolExecutor» - заставить его просыпаться и проверять состояние исполнителя. Если это состояние фактически не изменилось, оно вернется к 'poll()' или 'take()' следующей задаче из рабочей очереди. – erickson

+0

Очистить ответ! Спасибо! –

0

Как это хорошее article предположить, никогда не глотать InterruptedException.

+0

Статья довольно старая и не учитывает современный пакет Java Concurrent. Идеи, конечно, одинаковы, но контекст может быть другим, поскольку «Исполнительная служба» отвечает за это. –