java - 循环 Futures - 你应该先检查 isDone 吗?

标签 java multithreading concurrent.futures

我有一份 future list 。

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

我假设在选项1中,当get调用被阻塞时,这不会影响后台的futures处理。我的假设正确吗?

最佳答案

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

第二个不仅没有必要,而且 super 浪费。现在,您不再将 CPU 交给其他线程,而是繁忙的循环,无缘无故地旋转 CPU 消耗 CPU 周期。

关于java - 循环 Futures - 你应该先检查 isDone 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56677970/

相关文章:

java - 对象 ArrayList 中 contains(Object o) 的时间复杂度

java - 如何检索存储在 LinkedList 中的对象的字段值?

java - 如何在没有 Selenium 网格的情况下在浏览器的多个实例中并行运行单个测试用例

api - API 应该返回 CompletionStage 还是 CompletableFuture

python - Concurrent.futures - 返回导入模块未定义的错误

java - 如何强制初始化 Hibernate JPA 代理以在 JSON 调用中使用它

java - JMS:可以在一个线程上通过 MessageConsumer.receive() 读取,然后从另一个线程调用 Session.commit() 吗?

multithreading - 使用非重叠向量 block ,并合并结果

python - ProcessPoolExecutor 使用 map 卡在大负载上

java - startsWith() 无法与 '§' 字符正常工作