3

在此示例中,我向比较器对象提交了一些文件。一切正常,除了我注意到提交文件的顺序并不总是与返回文件的顺序相同。关于如何更好地控制它的任何建议?

 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();
4

2 回答 2

3

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

于 2010-06-10T18:44:32.457 回答
0

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

- 编辑 -

如果您仍然想要并发,但想要按特定顺序等待任务,请不要使用完成服务。只需按所需顺序循环期货,并调用它们的 get() 方法,如果需要,该方法会阻塞。

于 2010-06-10T18:47:35.730 回答