【问题标题】:List of Strings is not running in parallel - Java 8 parallel streams字符串列表未并行运行 - Java 8 并行流
【发布时间】: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


【解决方案1】:

不同的行为不是由不同的流引起的(IntStream vs. Stream&lt;String&gt;)。

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

IntStream sn-p 中,您在peek() 调用中执行sleep,这允许它为不同的元素并行运行,这就是该管道快速结束的原因。

Stream&lt;String&gt;sn-p 中你正在执行forEachOrdered 中的sleep,这意味着每个元素的sleep() 必须在前一个元素的sleep() 结束之后执行。这就是forEachOrdered - This operation processes the elements one at a time, in encounterorder if one exists. 的行为

如果添加peek() 调用,则可以使第二个 sn-p 的行为与第一个相似:

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

【讨论】:

    猜你喜欢
    • 2014-07-24
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2016-02-28
    • 2016-08-27
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多