ventajas teoria simple reutilizar reutilización programacion poo orientada objetos más metodo introduccion herencia forma definicion código como codigos ala java concurrency executorservice java.util.concurrent

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.