에서 Fork/Join 프레임 워크를 사용할 수 있습니다. 비동기 처리를 위해 프로세스를 대기열에 넣고 완료 알림을 기다린 다음 종료 할 수 있습니다. 이 방법이 효과적이지만 새로운 동시성 도구를 사용할 수 있습니다. Java Concurrency Lesson을 읽는 것이 좋습니다.
동시성에 대한 새로운 모델을 사용하면 스레드를 통해 작업 (Runnable
및 Callable
및 ExecutorService
)을 통해 동시성 문제를 분리 할 수 있습니다. 스레드로 직접 작업하고 자신 만의 스레드 풀을 만드는 대신 Executor
이 힘든 일을하도록하십시오.
...
ExecutorService ex = Executors.newSingleThreadExecutor();
....
당신은 ExecutorService에에,보다 Runnable과 Callables의 형태로 작업을 손과 작업의 진행 상황을 모니터링하기 위해 사용될 수있다 반환 미래 오브젝트에 나타날 수 있습니다.
Future<String> f = executor.submit(new Foo());
....
class Foo implements Callable<String> {
@Override
public String call() throws Exception {
return "Bar";
}
}
당신은 당신을위한 작업의 완료 모니터링 할 ExecutorCompletionService를 사용할 수 있습니다 :
CompletionService<String> cs = new ExecutorCompletionService<String>(executor);
Future<String> f = cs.submit(new Foo());
... // Let's say you've added TASK_COUNT tasks
for (int i = 0; i < TASK_COUNT ; i++) {
try {
String str = cs.take().get();
if (str != null) {
System.out.println(str); //Handle the result of the Callable
continue;
}
} catch (ExecutionException ignore) {}
}
지금 당신은 당신이받은 Future f
개체를 사용하여 호출, 정리할 수있는 작업에 따라 결과를받은
을 이전
cs.submit(new Foo())
와 각 작업에
f.cancel(true)
를 호출하여. 그리고 마지막으로,
executor.shutdown();
이것보다 동시성에 대한 더 많은이있다하여 집행을 정리하는 것을 잊지 있지만, 나는 위의 요구 사항을 충족하는 방법을 보여 있다고 생각하지 않습니다. JavaDoc도 읽는 것이 좋습니다.
'Future's http://www.vogella.com/articles/JavaConcurrency/article.html#futures –
에서 작업 수를 알고있는 경우에만 'CountDownLatch'를 사용할 수도 있습니다. 모든 작업이 완료 될 때까지 코드를 차단합니다. http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html –
작업이 대기열에 제출됩니다.대기열은 실행 프로그램에 의해 폴링되고 태스크를 실행합니다. 그래서 기본적으로 작업을 완료했는지 또는 여전히 실행 중인지 확인하기 위해 대기열을 폴링하려고합니다. –