2011-09-07 4 views
1

저는 ExecutorService를 처음 사용 합니다만, 이에 대한 접근 방법은 확실하지 않습니다. 알려진 작업에 대해 최대 100 개의 스레드를 처리 할 수 ​​있습니다. 아래의 일반 형식을 사용하여 List of FutureTasks를 만든 다음 ExecutorService에 제출합니다. ExecutorService는 보류중인 결과를 반환하고 다른 목록에 추가합니다. 그런 다음이 목록을 반복하면서 각 보류 결과에 대해 get()을 호출합니다.Executor 서비스에서 여러 결과를 효율적으로 처리하는 방법

내 쿼리 : 100 개의 스레드가 모두 완료 될 때까지 각 get()에서이 블록을 차례로 수행하지 않겠습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

그리고 get()이 Callable 구현의 call() 메소드의 결과를 반환한다고 가정하는 것이 맞습니까? 나는 기본 FutureTask 클래스를 사용하고 있으며 그것을 서브 클래 싱하지 않았다.

ExecutorService exec = Executors.newFixedThreadPool(NUM_THREADS); 

List<JobClass> originalList = new ArrayList<JobClass>(); 

List<SomeOtherClass> pendingResult = new ArrayList<SomeOtherClass>(); 

List<Future<SomeOtherClass>> resultList = new ArrayList<Future<SomeOtherClass>>(); 

for(JobClass sc : originalList) 
    pendingResult.add(submit(sc); 

for(Future<SomeOtherClass> future : futures) 
    resultList.add(future.get(5, TimeUnit.SECONDS)); 

답변

5

좋은 질문입니다. 올바르게 이해하면 완료된 작업의 결과가 소비되는 것이 걱정됩니다. 예, 스레드가 차단됩니다. Java에 대한 대답은 CompletionService입니다.

문서 페이지 "새 비동기 작업의 생성을 완료된 작업의 결과 소비와 분리하는 서비스"에서 언급했듯이.

+0

샘플 코드가 필요한 경우 알려주십시오. –

+0

감사합니다. doc_180, 팁과이 기사 [link] (http://blog.teamlazerbeez.com/2009/04/29/java-completionservice/) 사이에서 문제가 해결되었습니다. –

2

모든 작업이 완료된 경우에만 진행하면 제안한 작업을 수행 할 수 있습니다. 작업이 완료되는 순서는 중요하지 않습니다. 그러나 작업 결과를 가능한 빨리 다른 프로세서로 전달하거나 작업 실행 중에 다른 작업을해야하는 경우 작업이 완료되었는지 먼저 확인하고 예를 들어 isDone 메서드를 사용하여 get()을 호출 할 수 있습니다.

관련 문제