【发布时间】:2021-09-11 14:55:16
【问题描述】:
我需要使用并行流运行集合,并且它始终按顺序运行,在下面的示例中,List 始终按顺序运行,而IntStream 是并行运行的。有人可以帮我理解在IntStream 上运行并行Stream 和在List<String> 上并行Stream 之间的区别。
另外,您能否帮助编写代码 sn-p 如何并行运行 List<String>,类似于 IntStream 并行运行的方式?
import java.util.List;
import java.util.stream.IntStream;
public class ParallelCollectionTest {
public static void main(String[] args) {
System.out.println("Parallel int stream testing.. ");
IntStream range2 = IntStream.rangeClosed(1, 5);
range2.parallel().peek(t -> {
System.out.println("before");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).forEachOrdered(System.out::println);
System.out.println("Parallel String collection testing.. ");
List<String> list = List.of("a","b","c","d");
list.stream().parallel().forEachOrdered(o ->
{
System.out.println("before");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(o);
});
}
}
以上代码的输出如下。
Parallel int stream testing..
before
before
before
before
before
1
2
3
4
5
Parallel String collection testing..
before
a
before
b
before
c
before
d
【问题讨论】:
-
所以您是说这段代码大约需要 51 秒才能完成,而第二部分花费了 50 秒?
-
不,我的意思是说 IntStream 并行处理元素,如您所见,“之前”为多个元素打印,它等待给定睡眠时间,然后打印元素(1,2,3 ,4,5),但在字符串列表的情况下,它打印“之前”并等到睡眠时间,然后打印元素“a”,并为 seq 中的每个元素(b,c,d)重复这些步骤.
标签: java java-8 parallel-processing java-stream parallelstream