Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java executorService如何将任务“i”的结果存储在“数组[i]”中?_Java_Arrays_Multithreading_List_Concurrency - Fatal编程技术网

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());