studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java multithreading executorservice

java - para - manual de programacion android pdf



¿Apagar y esperar? ¿Qué primera llamada tiene alguna diferencia? (5)

Debe llamar al método shutdownNow () después de que haya ocurrido la llamada al método awaitTermination (). Entonces solo usted puede averiguar el uso real del método awaitTermination ()

Cuál es la diferencia entre

ExecutorService eService = Executors.newFixedThreadPool(2); eService.execute(new TestThread6()); eService.execute(new TestThread6()); eService.execute(new TestThread6()); eService.awaitTermination(1, TimeUnit.NANOSECONDS); eService.shutdown();

y

eService.shutdown(); eService.awaitTermination(1, TimeUnit.NANOSECONDS);

Realmente no entiendo el shutdown() . Este método no espera a que las tareas enviadas previamente completen la ejecución. ¿Significa que shutdown() puede terminar las tareas que se enviaron pero no se completaron? Probé algunos ejemplos, no lo prueban, por favor dame un ejemplo.


Deberías llamar primero a shutdown . De lo contrario, podría estar esperando mucho tiempo, ya que awaitTermination realidad no cierra su ejecutor.

Si desea esperar a que se completen las tareas, en lugar de esperar a que se cierre el ejecutor, debe usar invokeAll .


Después de que iniciemos la primera tarea, ThreadPoolExecutor iniciará un Thread que no terminará incluso después de que la tarea haya finalizado. Al menos es cierto para un grupo de subprocesos fijos. Es por esto que necesitamos llamar a shutdown. Después del cierre, ThreadPoolExecutor rechazará cualquier tarea nueva, pero esperará a que finalicen las tareas en ejecución y luego permitirá que finalicen los subprocesos. Esta es la razón por la que necesitamos esperar la finalización después de shutdwon.


Leer la documentación siempre ayuda:

shutdownNow

Intenta detener todas las tareas en ejecución activa, detiene el procesamiento de las tareas en espera y devuelve una lista de las tareas que estaban pendientes de ejecución. Estas tareas se drenan (eliminan) de la cola de tareas al regresar de este método.

Este método no espera a que se ejecuten activamente las tareas para terminar. Utilice awaitTermination para hacer eso.

No hay garantías más allá de los mejores esfuerzos para detener el procesamiento de tareas que se ejecutan activamente. Esta implementación cancela las tareas a través de Thread.interrupt (), por lo que cualquier tarea que no responda a las interrupciones nunca puede terminar

shutdown

Inicia un cierre ordenado en el que se ejecutan las tareas enviadas anteriormente, pero no se aceptarán nuevas tareas. La invocación no tiene ningún efecto adicional si ya está cerrado.

Este método no espera a que las tareas enviadas previamente completen la ejecución. Utilice awaitTermination para hacer eso.

awaitTermination :

Se bloquea hasta que todas las tareas hayan finalizado la ejecución después de una solicitud de cierre , o se produzca el tiempo de espera, o se interrumpa el hilo actual, lo que ocurra primero.


shutdown significa que el servicio del ejecutor no toma más tareas entrantes.

awaitTermination se invoca después de una solicitud de cierre.

Primero debe cerrar el servicio y luego bloquear y esperar a que finalicen los hilos.

Si desea ver que todos los subprocesos terminen de ejecutarse e insiste en usar awaiTermination , debe configurar el parámetro de tiempo de espera para que sea lo suficientemente grande. Para que pudieras hacer:

eService.shutdown(); if (!eService.awaitTermination(60000, TimeUnit.SECONDS)) System.err.println("Threads didn''t finish in 60000 seconds!"); }

Alternativamente, podrías hacer:

eService.shutdown(); while (!eService.isTerminated()) { }

De esta manera, puede asegurarse de que todos los subprocesos hayan terminado de ejecutarse a menos que se interrumpan inesperadamente.