ScheduledExecutorService запускает несколько раз

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

Ответ 1

Вы можете повторно использовать планировщик, но его не следует отключать. Скорее, отмените текущий поток, который вы можете получить при вызове метода 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()

Ответ 2

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

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

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

Ответ 3

Вы не можете заставить своего исполнителя принимать новые задачи после его закрытия. Более уместным вопросом является то, почему вам нужно сначала закрыть его? Созданные вами исполнители должны повторно использоваться на протяжении всего срока службы вашего приложения или подсистемы.