java在期货中的循环应该先检查isDone吗?
我有一份未来的清单
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
调用被阻塞时,这不会影响后台对未来的处理。我的假设正确吗
# 1 楼答案
对。做第一个。等待一个未来的结果不会影响其他任何一个(甚至你正在等待的结果)
第二种方法不仅不必要,而且非常浪费。现在,不再将CPU让给其他线程,而是有一个繁忙的循环,它会无缘无故地旋转CPU消耗周期
# 2 楼答案
是的,它不会影响,所有未来的任务都在后台并行运行。参考:https://javarevisited.blogspot.com/2015/01/how-to-use-future-and-futuretask-in-Java.html#axzz5rLieL6lf