2013-09-19 2 views
0

У меня есть требование, когда я выполняю количество потоков на ежедневной основе. Каждый поток выполняет некоторую задачу. Проблема, которую я пытаюсь решить, заключается в том, чтобы изящно прекратить работу службы-исполнителя, используя стоп-файл, который передается в качестве параметра.Как изящно остановить службу-исполнитель с помощью подхода stopfile

Я использую подход проверки стоп-файла в методе запуска потока, но он выполнит пустой запуск для всех остальных задач. Вместо этого я ищу способ остановить задачи в самой исполнительной службе. Есть ли способ сделать это.

Я смотрел на это сообщение: Removing all queued tasks of an ThreadPoolExecutor

Может кто-то расширить еще на это?

ответ

1

Я использую подход проверки стоп-файла в методе запуска потока, но он выполнит пустой запуск для всех остальных задач. Вместо этого я ищу способ остановить задачи в самой исполнительной службе. Есть ли способ сделать это.

Я думаю, что правильный способ остановить ExecutorService - использовать метод executorservice.shutdownNow();. Это приведет к отмене любых заданий, которые не были выполнены, и прервут все выполняемые потоки.

Для проверки прерывания, ваши задачи должны сделать что-то вроде:

while (!Thread.currentThread().isInterrupted()) { 
    ... 
} 

Anyplace вы улавливаете InterruptedException, вы должны убедиться, что вы повторно включить флаг прерывания:

try { 
    // something that throws InterruptedException 
} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
    // maybe we should quit the thread here 
} 

Если вы используете сторонние библиотеки, которые могут есть InterruptedException, тогда вам следует использовать executorservice.shutdown(), который отменяет задания, но не прерывает потоки. Тогда вы должны поделиться каким-то volatile boolean shutdown флага (или AtomicBoolean) и сделать что-то в ваших работают методы:

while (!Thread.currentThread().isInterrupted() && !shutdown) { 
    ... 
} 

Btw, вы упоминаете «метод запуска потока». Чтобы быть уверенным, вы должны внедрить Runnable и передать их ExecutorService. Вы не должны отправлять Thread экземпляров.