Java executorService如何将任务“i”的结果存储在“数组[i]”中?
我读了这篇关于执行器服务的文章 当订单很重要时,我想填充一个固定大小的结果集合 当我知道任务Java executorService如何将任务“i”的结果存储在“数组[i]”中?,java,arrays,multithreading,list,concurrency,Java,Arrays,Multithreading,List,Concurrency,我读了这篇关于执行器服务的文章 当订单很重要时,我想填充一个固定大小的结果集合 当我知道任务I应该将其结果存储在array[I]中时,我可以填充一个数组 是否有其他内置方法按任务提交的顺序存储结果?我可以填写列表而不是数组吗?只需将submit()返回的Future存储在数组或列表中,然后迭代此列表并在每个Future上调用get(): List<Callable<Result>> tasks = ...; List<Future<Result>>
I
应该将其结果存储在array[I]
中时,我可以填充一个数组
是否有其他内置方法按任务提交的顺序存储结果?我可以填写列表而不是数组吗?只需将
submit()
返回的Future
存储在数组或列表中,然后迭代此列表并在每个Future上调用get()
:
List<Callable<Result>> tasks = ...;
List<Future<Result>> futures = new ArrayList<>();
for (Callable<Result> task : tasks) {
futures.add(executor.submit(task));
}
List<Result> results = new ArrayList<>();
for (Future<Result> future : futures) {
results.add(future.get());
}
列出任务=。。。;
列表期货=新的ArrayList();
for(可调用任务:任务){
添加(执行者提交(任务));
}
列表结果=新建ArrayList();
for(未来:未来){
results.add(future.get());
}
将未来
对象的结果按创建顺序添加到列表中:
// given some tasks and an executor
List<Callable<MyResult>> tasks;
ExecutorService exec;
List<MyResult> results = exec.invokeAll(tasks).stream()
.map(Future::get).collect(Collectors.toList());
//给定了一些任务和执行者
列出任务;
服务执行人;
List results=exec.invokeAll(tasks.stream())
.map(Future::get).collect(Collectors.toList());
您可以使用该方法。从javadocs:
参数:
任务-任务的集合
返回:
表示任务的未来列表,其顺序与迭代器为给定任务列表生成的顺序相同,每个任务列表都已完成
结果的顺序将与任务之一
集合相匹配
在一行中:
List<T> results =
executor.invokeAll(tasks).stream().map(Future::get).collect(Collectors.toList());
列出结果=
executor.invokeAll(tasks).stream().map(Future::get).collect(Collectors.toList());
您有n个任务,需要并行执行以计算每个任务的结果,但需要与任务的顺序相同的结果?这会同时执行吗?我的理解是,一个流只迭代一次,将所有流操作结合起来。这将在提交后立即调用Future.get,导致串行执行。@meriton这将串行调用Future/get(),但这并不意味着任务不能并行执行。只是他们的结果是连续收集的。我的回答中的代码基本上是Java8版本。@meriton Collection方法返回一个顺序流,而该方法返回一个并行流:我的代码将保持顺序。我关心的不是Future.get是否按顺序调用。我关心的是Future.get在提交剩余任务之前被调用,因为流会折叠所有映射操作。也就是说,如果我们执行Arrays.asList(1,2,3).stream().map(print(“S”)).map(print(“G”)).collect(Collectors.toList())我们得到的是输出SGSGSG
,而不是并行执行所需的SSSGGG
。@JBNizet-right。那么,编辑会修复它吗?有没有更好的办法?现在看起来有点傻。
List<T> results =
futures.stream().map(Future::get).collect(Collectors.toList());
List<T> results =
executor.invokeAll(tasks).stream().map(Future::get).collect(Collectors.toList());