字符串列表不是 运行 并行 - 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

不同的行为不是由不同的流引起的(IntStreamStream<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