我有一份 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/