ScheduledExecutorService commencer à arrêter plusieurs fois
-
25-09-2019 - |
Question
J'utilise ScheduledExecutorService , et après que je l'appelle shutdown, je ne peux pas programmer un Runnable dessus. Appel scheduleAtFixedRate(runnable, INITIAL_DELAY,
INTERVAL, TimeUnit.SECONDS)
après shutdown()
lance java.util.concurrent.RejectedExecutionException. Y at-il une autre façon d'exécuter une nouvelle tâche après shutdown()
est appelé ScheduledExecutorService ?
La solution
Vous pouvez réutiliser le planificateur, mais vous ne devriez pas arrêter cela. Au contraire, annuler le fil conducteur que vous pouvez obtenir lors de l'appel de méthode scheduleAtFixedRate. Ex:
//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()
Autres conseils
Les javadocs shutdown()
disent:
Initiates an orderly shutdown in which previously submitted tasks are executed,
but no new tasks will be accepted.
Alors, vous ne pouvez pas appeler shutdow()
et ensuite planifier de nouvelles tâches.
Vous ne pouvez pas faire votre exécuteur testamentaire accepter de nouvelles tâches après la fermeture. La question plus pertinente est la raison pour laquelle vous avez besoin de le fermer en premier lieu? Les exécuteurs vous créez devraient être réutilisés dans la durée de vie de votre application ou sous-système.