【问题标题】:What are pragmatic use cases of parallel stream in Java?Java中并行流的实用用例是什么?
【发布时间】:2020-04-23 05:59:53
【问题描述】:

从Java-8开始,我们可以使用并行流(java.util.stream包)

根据理论,众所周知,Java 的并行流适用于需要并行执行操作的情况,而 Java 的(顺序)流则相反。

此外,并行流在管理并行性方面有一点开销,需要非常谨慎。

可以使用它的实际用例有哪些?此外,在这种实际用例中,它如何胜过并行性成本?

【问题讨论】:

  • 当您有大量数据时,优先使用并行流,即比普通流多 100 万。其次,如果你有 1000 个数据,那么你可以通过流,因为在这种情况下,使用并行流会在内部创建多个线程,这会导致设备成本。
  • @NitinBisht 不要指望非印度人知道十万是什么。
  • 您真的是指“实时”吗?请参阅此定义:en.wikipedia.org/wiki/Real-time_computing。如果您确实是这个意思,那么答案是您可能不想在实时用例中使用流。性能可能太难以预测。
  • 除此之外 - 如果它对其他人有所帮助,这就是 Lakh 和常用约定 10lakhs = 1 million 的含义。
  • @Holger 嗯。我们希望能够在公制和英制之间进行转换而不会抱怨,我说我们也需要了解 10 万 :) 我希望我的银行里有几 10 万,我会告诉你的。

标签: java parallel-processing java-stream


【解决方案1】:

当您需要获取大量独立数据时,并行流很好。例如,您有一个大型数据库应用程序,其中多个应用程序正在从独立的表或单独的数据库中获取存储的数据,并行流将非常好。此外,在 Web 环境中,来自用户的请求独立于其他用户。这种情况下,并行流也不错。

【讨论】:

    【解决方案2】:

    并行流以并行模式在流上运行操作。 当您希望您的列表/记录处理快速时,因为使用多个线程来处理数据。 此外,您可能希望处理数据并以任意随机序列输出数据,因为数据处理由多个线程完成,因此序列可以是任何东西。

    list.parallelStream().forEach(System.out::println);

    并行流使用 ForkJoinPool 进行处理,因为它是 JVM 使用的通用池,可能非常严格。 您可以在一定程度上控制并行度,获取并行度最有效的方法是根据 CPU 内核,即并行度为 2*CPU_CORES

    像下面的例子一样,你可以控制并行度:

        final int parallelism = 10;
        ForkJoinPool forkJoinPool = new ForkJoinPool(parallelism);
        forkJoinPool.submit(() ->
        list.parallelStream().forEach(System.out::println)); 
    

    但要小心使用并行度,使用较大的并行度值会降低应用程序的性能。

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 2011-07-04
      • 1970-01-01
      • 2011-01-26
      • 2012-11-20
      • 1970-01-01
      • 2016-07-20
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多