我的<script>
方法call()
的返回值。 MyCallable类看起来像这样:
List<Person>
以下是我在CallableFuture类中编写的代码
public class MyCallable implements Callable <List<Person>>{
public List<Person> call() throws Exception {
...
return list
}
public MyCallable(List<Account> accountList) {
super();
}
}
我不知道如何迭代 ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
List<Future<List<Person>>> list = new ArrayList<Future<List<Person>>>();
for (int i = 0; i < 20; i++) {
Callable<List<Person>> worker = new MyCallable(accountList);
Future<List<Person>> submit = executor.submit(worker);
for(Future<List<Person>> :list){
//list.add(submit);
}
}
并向其添加list
。我这样做了吗?
答案 0 :(得分:3)
一些问题。首先,不要试图在提交每个结果后立即获取Future
的结果(如果你这样做,你基本上只是序列化所有内容并击败目的),提交 all of the,然后然后检索结果:
List<Future<List<Person>>> list = new ArrayList<Future<List<Person>>>();
for (int i = 0; i < 20; i++) {
Callable<List<Person>> worker = new MyCallable(accountList);
Future<List<Person>> submit = executor.submit(worker);
list.add(submit); // just keep track of them
}
// NOW the next step is to get the results...
接下来,您遇到了一些基本的语法问题。通常,迭代容器中的项目的语法是:
List<A> list = ...;
for (A a : list) {
// do things with 'a'
}
最后,您需要查看Future
的文档,其中显示了如何等待计算并使用Future#get()
获取结果。
将这一切放在一起你最终得到了下一步(在提交上述所有内容之后):
// ... all tasks submitted and 'list' now contains the Futures, next step:
for (Future<List<Person>> future : list) {
List<Person> result = future.get(); // wait for task to complete
// 'result' is now the List<Person> returned from the corresponding callable.
}
提交所有内容然后获取所有结果背后的想法是,您现在允许您的任务同时执行,而不是在添加下一个之前等待每个任务完成。然后,最后,即使您最终等待一些,也没关系,因为所有任务的总等待时间已按预期减少。