Pergunta

Eu estou usando o framework Executor para lançar vários segmentos usando um pool de threads ou seja newFixedThreadPool. Eu uso threadpool.submit (aThread) para enviar trabalhos a serem executados pelo pool de threads e isso funciona bem no entanto eu preciso para determinar quando todos os fios são tão completa que eu possa continuar com outro processamento. Eu olhei para usando Future.get (), que bloqueia até que o segmento está completo o problema aqui é que ele bloqueia até que o resultado está disponível. Eu também olhou para usar continuamente chamando o método isTerminated () seguido de um sono após a emissão do desligamento para verificar se os tópicos são completos, mas isso não parece limpo para mim. Existe outra maneira mais clara para isso? Além disso, se há uma exceção levantada em qualquer um dos tópicos que eu quero ser capaz de terminar todos os outros threads em execução e também parar qualquer tópico na fila na piscina seja iniciado. Qual é o melhor mecanismo para fazer isso?

Ansiosos para ouvir suas respostas

TIA

Foi útil?

Solução

Uma das formas mais limpas de abordar isto é, modificando as tarefas que lhe são submetidos. Ao registrar um callback com cada tarefa, ele pode notificar de conclusão normal ou uma exceção sem qualquer votação pela thread principal.

Você pode escrever uma simples wrapper que vai fazer isso para qualquer Runnable.

Ou, seguindo esse exemplo, você pode estender a idéia para embrulhar qualquer Callable.

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;
    }
  }

}

Outras dicas

Use ExecutorService #shutdown () e, em seguida, ExecutorService # awaitTermination ()

Por exemplo:

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

// All tasks have now finished

Quanto notificá-lo quando uma tarefa falha com uma exceção. Você terá que fornecer um ThreadFactory para o ExecutorService que define um "manipulador de exceção não capturada" para cada thread que ele cria. Este manipulador de exceção pode então terminar as tarefas em execução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top