字符串列表不是 运行 并行 - Java 8 个并行流
List of Strings is not running in parallel - Java 8 parallel streams
我要求 运行 使用并行流的集合,它总是按顺序 运行ning,在下面的示例中,列表总是按顺序 运行ning,其中因为 IntStream
是并行的 运行ning。有人可以帮助我理解 运行 在 IntStream
上并行 Stream
和在 List<String>
上并行 Stream
之间的区别。
此外,您能否提供代码片段如何 运行 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
不同的行为不是由不同的流引起的(IntStream
与 Stream<String>
)。
你的两个stream pipeline的逻辑不一样
在 IntStream
片段中,您在 peek()
调用中执行 sleep
,这允许它对不同的元素并行 运行,这就是为什么管道很快结束。
在 Stream<String>
片段中,您正在 forEachOrdered
中执行 sleep
,这意味着每个元素的 sleep()
必须在 [=20= 之后执行] 的前一个元素结束。这就是 forEachOrdered
- This operation processes the elements one at a time, in encounterorder if one exists.
的行为
如果您向第二个代码段添加 peek()
调用,则可以使第二个代码段的行为类似于第一个代码段:
System.out.println("Parallel String collection testing.. ");
List<String> list = List.of("a","b","c","d","e","f","g","h");
list.stream().parallel().peek(t -> {
System.out.println("before");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
})
.forEachOrdered(System.out::println);
现在它将产生:
Parallel String collection testing..
before
before
before
before
a
b
c
d
我要求 运行 使用并行流的集合,它总是按顺序 运行ning,在下面的示例中,列表总是按顺序 运行ning,其中因为 IntStream
是并行的 运行ning。有人可以帮助我理解 运行 在 IntStream
上并行 Stream
和在 List<String>
上并行 Stream
之间的区别。
此外,您能否提供代码片段如何 运行 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
不同的行为不是由不同的流引起的(IntStream
与 Stream<String>
)。
你的两个stream pipeline的逻辑不一样
在 IntStream
片段中,您在 peek()
调用中执行 sleep
,这允许它对不同的元素并行 运行,这就是为什么管道很快结束。
在 Stream<String>
片段中,您正在 forEachOrdered
中执行 sleep
,这意味着每个元素的 sleep()
必须在 [=20= 之后执行] 的前一个元素结束。这就是 forEachOrdered
- This operation processes the elements one at a time, in encounterorder if one exists.
如果您向第二个代码段添加 peek()
调用,则可以使第二个代码段的行为类似于第一个代码段:
System.out.println("Parallel String collection testing.. ");
List<String> list = List.of("a","b","c","d","e","f","g","h");
list.stream().parallel().peek(t -> {
System.out.println("before");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
})
.forEachOrdered(System.out::println);
现在它将产生:
Parallel String collection testing..
before
before
before
before
a
b
c
d