2015-03-16 1 views
1

Я использую ThreadPoolExecutor в Java для параллелизации обработки элементов. Каждая обработка элемента - отдельная задача, поэтому я помещаю ее в очередь для обработки исполнителем. К сожалению, некоторые задачи могут занять слишком много времени, и я хочу иметь возможность отменить такие задачи и продолжить работу с остальными. Я не хочу ждать метода shutdown и его таймаута (общая обработка занимает несколько дней). Я хочу что-то вроде цикла по выполняемым в настоящее время задачам и проверке того, как долго он работает, и отмените его, если он превысил лимит.Как отменить конкретную задачу по таймауту при использовании ThreadPoolExecutor в Java?

+0

Вы можете использовать 'FutureTask ', чтобы обернуть ваш« Runnable ». У этого метода 'cancel()': http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/FutureTask.html#cancel%28boolean%29 –

ответ

1

ThreadPoolExecutor возвращает объекты Future для вас, когда вы отправляете задания на него.

Используйте метод get(long timeout, TimeUnit unit) на своем фьючерсе, и если вы получите TimeoutException, а затем отмените их.

+0

Обратите внимание, что если вы вызываете 'cancel (true) ', код в' Runnable' будет вызывать 'InterruptedException', когда будет вызван любой метод, который потенциально может его вызвать, например' sleep() '. Вы также можете проверить, прерван ли ваш поток, вызвав 'Thread.interrupted()', как описано [здесь] (http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html). –

+0

Позвольте мне добавить, что если вы не назовете 'Thread.interrupted()' или 'sleep()' или что-то еще, ваш код будет закрыт __not__ только потому, что он является частью задачи, которая была отменена. –

+0

@GiovanniBotta Согласен. Я не вдавался в подробности прерывания задачи, потому что это еще одна тема. – lbalazscs

 Смежные вопросы

  • Нет связанных вопросов^_^