2010-11-17 13 views
11

Estoy usando ScheduledExecutorService, y después de llamar al método shutdown, no puedo programar un Runnable en él. Si llama al scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) después de shutdown() lanza java.util.concurrent.RejectedExecutionException. ¿Hay alguna otra forma de ejecutar una nueva tarea después de llamar al shutdown() en ScheduledExecutorService?ScheduledExecutorService start stop several times

+1

Ese es el comportamiento esperado. ¿Podría explicar qué está tratando de hacer y por qué quiere ejecutar otro ejecutable después de que se apaga? – Jeremy

Respuesta

35

Puede reutilizar el programador, pero no debe apagarlo. En su lugar, cancele el hilo en ejecución que puede obtener al invocar el método scheduleAtFixedRate. Ej .:

//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() 
+1

Pude cerrar y crear nuevos servicios en un entorno Spring, pero los EJB me causaban dolor. Esto hizo el truco, gracias! –

+0

@Alex El primer objeto futuro no se lanzará, hasta que se cierre el servicio. Será una pérdida de memoria cuando el servicio dura mucho y se programará muchas veces. Si es cierto, ¿hay alguna forma de evitar la pérdida de memoria? – Nickolas

+0

Estoy equivocado, el futureTask cancelado no se agregará a workQueue, por lo que será liberado por GC. – Nickolas

5

Los javadocs de shutdown() dicen:

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

Por lo tanto, no se puede llamar shutdow() y luego programar nuevas tareas.

+0

¿Alguna sugerencia sobre cómo reprogramar nuevas tareas después del cierre? – walters

+0

Cree un nuevo ScheduledExecutorService o no cierre el existente. ¿Hay alguna razón por la que lo cierras? –

2

No puede hacer que su ejecutor acepte nuevas tareas después de apagarlo. La pregunta más relevante es por qué necesita cerrarla en primer lugar. Los ejecutores que crees deben reutilizarse a lo largo de la vida de tu aplicación o subsistema.

Cuestiones relacionadas