java - simple - teoria de objetos
¿Se debe reutilizar un ejecutor? (3)
1) No puede reutilizar un ThreadPoolExecutor después de apagarlo, API
An ExecutorService can be shut down, which will cause it to reject new tasks
Nota: no cierre un ThreadPoolExecutor si desea reutilizarlo.
2) Si desea saber si necesita volver a crear su uso de ThreadPoolEdxecutor
ExecutorService.isShutdown()
Devuelve true si este ejecutor ha sido cerrado
¿Se debe reutilizar un objeto ejecutor después de un shutdown
? Quiero decir, si llamo a shutdown
o shutdownNow
después de que finalice el ejecutor, ¿debo hacer algo new
para crear un nuevo grupo de subprocesos o es posible de alguna manera "restablecer" / reutilizar el ejecutor terminado anteriormente y reutilizarlo?
Actualizar:
Si necesito crear un nuevo grupo de hilos, ¿cómo puedo "entender" que el anterior se ha detenido?
Por ejemplo:
public void startPool(){
if(threadPool != null && !threadPool.isShutdown()){
return;
}
threadPool = Executors.newCachedThreadPool();
//other stuff
}
public void stopPool(){
if(threadPool != null){
threadPool.shutdown();
}
}
No trabajará. Si llamo a stop
y luego start
un nuevo grupo de subprocesos no se creará debido a las condiciones. ¿Cuál es la forma correcta de codificar esto?
Desde el doc :
Al finalizar, un ejecutor no tiene tareas ejecutándose activamente, no hay tareas pendientes de ejecución y no se pueden enviar nuevas tareas
así que (brevemente), no, no puedes reutilizarlo. Desde el cierre () doc :
Inicia un cierre ordenado en el que se ejecutan las tareas enviadas anteriormente, pero no se aceptarán nuevas tareas.
Los métodos isTerminated()
y isShutdown()
se pueden usar para determinar si el ejecutor se ha cerrado y si las tareas se han completado respectivamente.
Estamos hablando de Oracla Javas ThreadPoolExecutor (implementando la interfaz Executor) aquí. Allí, el comentario del método sobre el apagado no prohíbe explícitamente una transición del apagado de vuelta a la ejecución , pero el comentario de la clase enumera todas las transiciones admitidas por ThreadPoolExecutors y no hay vuelta atrás del cierre . Volver atrás requeriría otro método de reinicio / inicio o similar. Esto no existe, pero alguien que lo encuentre útil podría extender la interfaz e implementar el reinicio después del apagado sin interrumpir la semántica del apagado. Probablemente sería un poco difícil hacerlo ya que el apagado en sí mismo no garantiza que el procesamiento se detenga eventualmente. Así que los trabajadores pueden continuar hasta que terminen, si es que terminan. Hacer que el reinicio sea posible en estas circunstancias probablemente no valía la pena el trabajo extra en comparación con solo crear otro ejecutor.