在Java并发编程实战第6章任务执行中,有关于invokeAll的使用。
当超时后,结束所有任务,不管有没有结果。
List<Future<TravelQuote>> futures = exec.invokeAll(tasks,time,unit);
List<TravelQuote> quotes = new ArrayList<TravelQuote>(tasks.size());
Iterator<QuoteTask> taskIter = tasks.iterator();
for (Future<TravelQuote> f : futures){
QuoteTask task = taskIter.next();
try{
quotes.add(f.get());
} catch (ExecutionException e) {
quotes.add(task.getFailureQuote(e.getCause()));
} catch (CancellationExceptione) {
quotes.add(task.getTimeoutQuote(e));
}
}
然而,为毛futures的遍历里面,可以直接将外部的taskIter取进来用???
难道invokeAll全部执行完成后,futures是按加入顺序遍历的,不然这代码行不通啊。
for (TravelCompany company : companies){
/**如下,加入时**/
A公司 == 新加坡
B公司 == 印度
C公司 == 日本
}
for (Future<TravelQuote> future : futures) {
/**结果顺序同上**/
A公司结果
B公司结果
C公司结果
}
???有待商榷