如何控制Java期货交易的订单;已提交;?

如何控制Java期货交易的订单;已提交;?,java,future,Java,Future,在本例中,我向comparator对象提交了几个文件。这一切都很好,只是我注意到提交文件的顺序并不总是与返回文件的顺序相同。关于如何更好地控制这一点,有什么建议吗 ExecutorService pool = Executors.newFixedThreadPool(5); CompletionService<Properties> completion = new ExecutorCompletionService<Properties>(pool); fo

在本例中,我向comparator对象提交了几个文件。这一切都很好,只是我注意到提交文件的顺序并不总是与返回文件的顺序相同。关于如何更好地控制这一点,有什么建议吗

 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();
ExecutorService池=Executors.newFixedThreadPool(5);
CompletionService completion=新的ExecutionCompletionService(池);
for(字符串目标:p.getTargetFiles()){
完成。提交(新属性加载器(目标,p));
}
对于(@SuppressWarnings(“未使用”)
字符串目标:p.getTargetFiles()){
属性r=null;
试一试{
r=完成。获取()。获取();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
p、 addTargetFilesProperties(r);
}
pool.shutdown();

使用
CompletionService.take
的主要目的是让它返回任何一个
将来完成的
,无论提交的顺序是什么。如果您想按顺序返回它们,您可能根本不需要使用它(您甚至可能根本不想使用
CompletionService
,但您可以)。保存一个从
submit()
返回的
Future
对象列表,并对每个对象调用
.get()
;它将一直阻止,直到结果可用。

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

--编辑--

如果您仍然需要并发性,但希望按特定顺序等待任务,请不要使用完成服务。只需按要求的顺序循环futures,并调用其get()方法,如有必要,该方法将进行阻止