2016-09-03 2 views
1

у меня есть:Как остановить Executors.newSingleThreadScheduledExecutor

private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); 

, который работает исполняемую задачу: (? WTF, почему)

executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS); 

Но оказывается, что executorService не способ отменить , отключить его - это не вариант, и я делаю что-то довольно просто, поэтому использование Executors.newScheduledThreadPool (у которого есть cancel()) - это немного перебор.

Есть ли способ правильно остановить выполнение задачи?

PS: Я искал, прежде чем я спросил, и я действительно не думаю, что это hack является правильным способом.

+0

Вы ищете один из методов 'shutDown *()'. – fge

+0

У меня есть только 'shutdownNow' и' shutDown' из 'executorService', и оба будут также предотвращать будущие задачи, но мне нужны будущие задачи. @fge – shinzou

ответ

1

executorService.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS); возвращает ScheduledFuture<V>, у которого есть метод cancel(boolean). Правильный способ отменить его - отменить его в будущем.

EDIT: Однако я считаю, что это не может остановить задачу во время ее выполнения, только предотвратить будущие казни. Использование логического флага требует, чтобы задача была осведомлена о системе Thread.isInterrupted().

+0

Итак, у меня должен быть элемент данных для 'ScheduledFuture ' и заполнить его при вызове' scheduleAtFixedRate'? потому что мне нужно остановить задачу из самой задачи, которая находится в запущенной оболочке. – shinzou

+0

Если вам нужна единственная возможность отменить, просто выбросьте исключение из метода '.run()'. Контракт явно говорит, что это остановит любые будущие казни. – Kiskae

+0

Но это не какие исключения для нет? и исключения считаются «тяжелыми для выполнения», так что это не так дорого? – shinzou