遍历期货-您是否应该先检查isDone?

时间:2019-06-20 01:49:52

标签: java multithreading concurrent.futures

我有一个期货清单。

List<Future> futures = new ArrayList<Future>();

futures.add(task1());
futures.add(task2());

这两种获取结果的方法之间有区别吗?

// Option 1
for (Future future : futures) {
  results.add(future.get());
}

// Option 2
boolean incompleteFound;
do {
 incompleteFound = false;
 for (Future future : futures) {
    if (!future.isDone()) {
      incompleteFound = true;
    }
 }
} while (incompleteFound);

for (Future future : futures) {
  results.add(future.get());
}

我假设Option 1处于阻塞状态时,在get中,这不会影响后台期货的处理。我的假设是正确的吗?

2 个答案:

答案 0 :(得分:3)

正确。做第一个。等待一个未来的结果不会影响其他任何结果(甚至不会影响您正在等待的结果)。

第二个不仅不必要,而且非常浪费。现在,您不再需要将CPU分配给其他线程,而是拥有一个繁忙的循环,该循环将无缘无故地旋转CPU消耗的CPU周期。

答案 1 :(得分:1)

是的,这不会影响,所有将来的任务都会在后台并行运行。请参阅:https://javarevisited.blogspot.com/2015/01/how-to-use-future-and-futuretask-in-Java.html#axzz5rLieL6lf