Подтвердить что ты не робот

Как прервать потоки ExecutorService

При использовании ExecutorService, возвращаемого Executors.newSingleThreadExecutor(), как его прервать?

4b9b3361

Ответ 1

Для этого вам нужно submit() выполнить задачу ExecutorService вместо вызова execute(). Когда вы это сделаете, возвращается Future, который можно использовать для управления запланированной задачей. В частности, вы можете вызвать cancel(true) в связанной Future, чтобы прервать выполняемую в настоящее время задачу (или вообще пропустить выполнение, если задача еще не запущен).

Кстати, объект, возвращенный Executors.newSingleThreadExecutor(), на самом деле является ExecutorService.

Ответ 2

Другой способ прервать поток (ы), управляемый внутренним управлением, - вызвать метод shutdownNow(..) на вашем ExecutorService. Обратите внимание, однако, что в отличие от решения @erickson это приведет к тому, что весь ThreadPoolExecutor станет непригодным для дальнейшего использования.

Я нахожу этот подход особенно полезным в случаях, когда ExecutorService больше не нужен, и сохранение вкладок в экземплярах Future в противном случае не является необходимым (ярким примером этого является метод exit(..) вашего приложения).

Соответствующая информация из ExecutorService#shutdownNow(..) javadocs:

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

Нет никаких гарантий, кроме попыток максимального прекращения обработки активно выполнять задачи. Например, типичные реализации отменить через Thread.interrupt, поэтому любая задача, которая не отвечает на прерывания никогда не прекращаются.