2010-06-10 4 views
3

이 예제에서는 몇 가지 파일을 내 comparator 개체에 제출합니다. 파일이 제출되는 순서가 반환되는 순서와 항상 같지는 않다는 것을 제외하고는 모두 잘 작동합니다. 내가 더 잘 제어 할 수있는 방법에 대한 제안?Java Futures가 "제출"되는 주문을 제어하는 ​​방법은 무엇입니까?

ExecutorService pool = Executors.newFixedThreadPool(5); 
    CompletionService<Properties> completion = new ExecutorCompletionService<Properties>(pool); 

    for (String target : p.getTargetFiles()) { 
    completion.submit(new PropertiesLoader(target, p)); 
    } 

    for (@SuppressWarnings("unused") 
    String target : p.getTargetFiles()) { 
    Properties r = null; 
    try { 
    r = completion.take().get(); 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } catch (ExecutionException e) { 
    e.printStackTrace(); 
    } 

    p.addTargetFilesProperties(r); 
    } 

    pool.shutdown(); 

답변

3

CompletionService.take를 사용하여의 주요 포인트는 상관없이이 제출 된 어떤 순서로 완료 없다 중 Future 반환하는 것입니다. 순서대로 반환하려는 경우에는 전혀 사용하지 않을 수도 있습니다 (CompletionService을 사용하고 싶지는 않지만 할 수 있습니다). Future 개체의 목록을 submit()에서 반환하고 각 개체에 .get()을 호출합니다. 결과를 사용할 수있을 때까지 차단됩니다.

0

ThreadPoolExecutor에 여러 작업을 동시에 제출할 때 여러 스레드가 동시에 실행하기 때문에 종료 시간을 실제로 제어 할 수 없습니다. 완료 서비스는 완료된 순서대로 반환하며 실행마다 다를 수 있습니다. 순차적으로 작업을 실행하기로 결정하면 완료 순서는 활성화 순서와 동일합니다.

--EDIT--

당신은 여전히 ​​동시성을 원하지만 완성 서비스를 사용하지 않는 특정 순서로 작업을 기다려야합니다. 선물을 필요한 순서로 반복하기 만하면됩니다. 필요한 경우 get() 메소드를 호출하십시오.