2

我需要使用并行流运行集合,并且它始终按顺序运行,在下面的示例中,列表始终按顺序IntStream运行,而并行运行。Stream可以请一些人帮助我了解运行并行运行IntStream和并行Stream运行之间的区别List<String>

此外,您能否帮助代码片段如何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

4

1 回答 1

3

不同的行为不是由不同的流(IntStreamvs. Stream<String>)引起的。

你的两个流管道的逻辑是不一样的。

IntStream代码片段中,您正在执行sleepinpeek()调用,这允许它为不同的元素并行运行,这就是该管道快速结束的原因。

Stream<String>代码片段中,您正在执行sleepin forEachOrdered,这意味着sleep()必须sleep()在前一个元素的结束之后执行每个元素的 。这就是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
于 2021-06-29T11:49:27.190 回答