문제

Executor Framework를 사용하여 ThreadPool IE NewFixedThreadpool을 사용하여 여러 스레드를 시작합니다. ThreadPool.Submit (ATHREAD)을 사용하여 ThreadPool에서 실행할 작업을 제출하므로 제대로 작동하지만 모든 스레드가 완료된시기를 결정해야합니다. 스레드가 완료 될 때까지 차단하는 Future.get ()를 사용하는 것을 살펴 보았습니다. 또한 모든 스레드가 완성되었는지 확인하기 위해 종료를 발행 한 후 isterminated () 메소드를 계속 호출 한 후 수면을 사용하는 것을 보았지만 이는 나에게 깔끔하지는 않습니다. 이것에 대한 또 다른 더 깨끗한 방법이 있습니까? 또한 스레드 중 하나에 예외가 발생하면 다른 모든 실행 스레드를 종료하고 풀에서 큐인 스레드를 중지하고 싶습니다. 이 작업을 수행하는 가장 좋은 메커니즘은 무엇입니까?

귀하의 답변을 듣기를 기대합니다

티아

도움이 되었습니까?

해결책

이에 접근하는 더 깨끗한 방법 중 하나는 제출 된 작업을 수정하는 것입니다. 각 작업에 콜백을 등록하면 메인 스레드의 폴링없이 정상 완료 또는 예외를 알릴 수 있습니다.

이 작업을 수행 할 간단한 래퍼를 쓸 수 있습니다. 어떠한 것도 Runnable.

또는 그 예제에 따라, 당신은 아이디어를 랩핑하도록 확장 할 수 있습니다. 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;
    }
  }

}

다른 팁

사용 ExecutorService#shutdown () 그리고 ExecutorService#awaittermination ()

예를 들어:

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

// All tasks have now finished

작업이 예외로 실패 할 때 알려주는 한. 당신은 제공해야합니다 Threadfactory 생성하는 각 스레드에 대해 "끊임없는 예외 핸들러"를 설정하는 ExecutorService에. 이 예외 핸들러는 실행중인 작업을 종료 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top