如何Iteratre未来<list>对象?

时间:2016-08-29 00:51:42

标签: java multithreading list concurrency

我的<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。我这样做了吗?

1 个答案:

答案 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.
}

提交所有内容然后获取所有结果背后的想法是,您现在允许您的任务同时执行,而不是在添加下一个之前等待每个任务完成。然后,最后,即使您最终等待一些,也没关系,因为所有任务的等待时间已按预期减少。