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

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


person walters    schedule 17.11.2010    source источник
comment
Это ожидаемое поведение. Не могли бы вы объяснить, что вы пытаетесь сделать и почему вы хотите запустить другой исполняемый файл после завершения работы?   -  person Jeremy    schedule 17.11.2010


Ответы (3)


Вы можете повторно использовать планировщик, но вы не должны его выключать. Скорее отмените запущенный поток, который вы можете получить при вызове метода 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()
person Alex Objelean    schedule 24.10.2011
comment
Я смог завершить работу и создать новые службы в среде Spring, но EJB меня огорчали. Это помогло, спасибо! - person Eric Thorbjornsen; 03.08.2012
comment
@Alex Первый будущий объект не будет выпущен, пока служба не будет отключена. Это будет утечка памяти, когда служба будет жить долго и планировать много раз. Если да, то есть ли способ избежать утечки памяти? - person Nickolas; 09.10.2013
comment
Я ошибаюсь, отмененная futureTask не будет добавлена ​​в workQueue, поэтому она будет выпущена сборщиком мусора. - person Nickolas; 09.10.2013

Javadocs shutdown() сказать:

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

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

person Peter Knego    schedule 17.11.2010
comment
Любые предложения о том, как перепланировать новые задачи после выключения? - person walters; 18.11.2010
comment
Либо создайте новый ScheduledExecutorService, либо не выключайте существующий. Есть ли причина, по которой вы его закрываете? - person Peter Knego; 18.11.2010

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

person Kent Murra    schedule 24.10.2011