2010-06-10 29 views
3

在这个例子中,我提交了几个文件到我的比较对象。它一切正常,但我注意到提交文件的顺序并不总是与它们返回的顺序相同。有关如何更好地控制此问题的任何建议?如何控制Java期货被“提交”的订单?

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,但你可以)。请保留从submit()返回的Future对象列表,并在每一个对象上调用.get();它会阻塞,直到结果可用。

0

当一次向ThreadPoolExecutor提交多个任务时,由于它们由多个线程同时执行,因此您无法真正控制终止时间。 完成服务按照它们完成的顺序返回它们,这可能因执行而异。如果您决定连续执行任务,则完成顺序与激活顺序相同。

- 编辑 -

如果你仍然想并发性,但希望等待特定顺序的任务,不使用完成的服务。简单地按要求的顺序循环使用期货,并调用他们的get()方法,如果需要的话可以阻止它。