Pregunta

Estoy usando el marco Ejecutor para iniciar varios subprocesos usando un conjunto de subprocesos, es decir, newFixedThreadPool. Utilizo threadpool.submit (aThread) para enviar trabajos para que los ejecute el threadpool y esto funciona bien, sin embargo, necesito determinar cuándo están completos todos los hilos para poder continuar con otro procesamiento. Miré el uso de Future.get () que bloquea hasta que el hilo se completa, el problema aquí es que se bloquea hasta que un resultado esté disponible. También examiné el uso continuo de llamadas al método isTerminated () seguido de una suspensión después de emitir el apagado para verificar si todos los subprocesos están completos, pero esto no me parece ordenado. ¿Hay otra forma más limpia de esto? Además, si se produce una excepción en cualquiera de los subprocesos, deseo poder finalizar todos los demás subprocesos en ejecución y también detener el inicio de cualquier subproceso en cola en el grupo. ¿Cuál es el mejor mecanismo para hacer esto?

Esperamos escuchar sus respuestas

TIA

¿Fue útil?

Solución

Una de las formas más limpias de abordar esto es modificando las tareas que se envían. Al registrar una devolución de llamada con cada tarea, puede notificar la finalización normal o una excepción sin ninguna encuesta por el hilo principal.

Puede escribir un simple contenedor que hará esto para cualquier Runnable .

O, siguiendo ese ejemplo, puede extender la idea para envolver cualquier invocable .

class CallbackTask<T>
  implements Callable<T>
{

  private final Callable<? extends T> task;

  private final Callback<T> callback;

  CallbackTask(Callable<? extends T> task, Callback<T> callback)
  {
    this.task = task;
    this.callback = callback;
  }

  public T call()
    throws Exception
  {
    try {
      T result = task.call();
      callback.complete(result);
      return result;
    }
    catch (Exception ex) {
      callback.failed(ex);
      throw ex;
    }
  }

}

Otros consejos

Use ExecutorService #shutdown () y luego ExecutorService # awaitTermination ()

Por ejemplo:

ExecutorService service = Executors.newCachedThreadPool();
service.submit(...);
service.submit(...);
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

// All tasks have now finished

En cuanto a notificarte cuando una tarea falla con una excepción. Deberás proporcionar un ThreadFactory al ExecutorService que establece un "controlador de excepción no capturado" para cada hilo que crea. Este controlador de excepciones puede finalizar las tareas en ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top