ScheduledExecutorService начать останавливаться несколько раз - PullRequest
15 голосов
/ 17 ноября 2010

Я использую ScheduledExecutorService , и после вызова метода shutdown я не могу запланировать Runnable для него. Вызов scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) после shutdown() вызывает исключение java.util.concurrent.RejectedExecutionException. Есть ли другой способ запуска новой задачи после вызова shutdown() на ScheduledExecutorService ?

Ответы [ 3 ]

40 голосов
/ 24 октября 2011

Вы можете повторно использовать планировщик, но не выключайте его. Скорее, отмените запущенный поток, который вы можете получить при вызове метода scheduleAtFixedRate. Пример:

//get reference to the future
Future<?> future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS)
//cancel instead of shutdown
future.cancel(true);
//schedule again (reuse)
future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS)
//shutdown when you don't need to reuse the service anymore
service.shutdown()
6 голосов
/ 17 ноября 2010

Javadocs shutdown() говорят:

Initiates an orderly shutdown in which previously submitted tasks are executed,
but no new tasks will be accepted.

Итак, вы не можете вызвать shutdow() и затем запланировать новые задачи.

2 голосов
/ 24 октября 2011

Вы не можете заставить своего исполнителя принимать новые задачи после его закрытия. Более актуальный вопрос - зачем вам сначала его выключать? Созданные вами исполнители должны повторно использоваться на протяжении всего жизненного цикла приложения или подсистемы.

...