当前位置: 首页 > 知识库问答 >
问题:

Java SE8中parallelStream的优点[副本]

岳城
2023-03-14
double average = roster
        .stream()  /** non-parallel **/
        .filter(p -> p.getGender() == Person.Sex.MALE)
        .mapToInt(Person::getAge)
        .average()
        .getAsDouble();    

double average = roster
        .parallelStream()
        .filter(p -> p.getGender() == Person.Sex.MALE)
        .mapToInt(Person::getAge)
        .average()
        .getAsDouble();

除了我的代码运行在单个核心机器上(此时我假设JVM会将所有工作分配给单个core,从而不会破坏我的程序)之外,到处使用parallelStream()是否有任何缺点?

共有1个答案

淳于涛
2023-03-14

如果您听Oracle的人谈论Java8背后的设计选择,您会经常听到并行性是主要动机。并行化是lambdas、stream API和其他应用程序背后的主要推动力。让我们看一个stream API的示例。

private long countPrimes(int max) {
         return range(1, max).parallel().filter(this::isPrime).count();
}

private boolean isPrime(long n) {
            return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0);
} 

这里我们有一个countPrimes方法,它对1到max之间的素数进行计数。数字流由range方法创建。然后流被切换到并行模式,不是素数的数字被过滤掉,剩余的数字被计数。

您可以看到stream API允许我们以简洁方式描述问题。而且,并行化只是调用parallel()方法的问题。当我们这样做时,流被分割成多个块,每个块被独立地处理,并且在结束时总结结果。由于我们对isPrime方法的实现是极其无效和CPU密集的,所以我们可以利用并行化的优势,利用所有可用的CPU核。参考文献:http://java.dzone.com/articles/think-twice-using-java-8

 类似资料:
  • 处理高性能和高效率的并发一直是部署nginx的主要优势。现在我们来了解有关Nginx更多的优点。 在过去几年中,Web架构师已经接受了将应用程序基础架构与Web服务器分离和分离的想法。 然而,以前以LAMP(Linux,Apache,MySQL,PHP,Python或Perl)为基础的网站的形式可能不仅仅是一个基于LEMP的(“E”代表“Engine x”)) ,但是越来越多地将网络服务器推送到基

  • 我想从复杂映射中读取值,并并行执行一个函数。为此,我使用了Java 8中的ForkJoinPool。 我在这里面临的问题是,对于少数值,函数执行两次。起初我认为,Hashmap不是线程安全的,所以我尝试使用HashTable,但它是相同的。。。

  • 问题内容: 使Java中的枚举类似于类而不是像C / C ++那样仅是常量集合有哪些优点? 问题答案: 您可以获得有效值的免费编译时检查。使用 不保证 只会接受0或1作为参数值。使用枚举是可以保证的。此外,由于您可以使用代码完成功能来查看所有枚举值,因此这会导致更多的自我记录代码。

  • 此代码给出输出ELSE 此代码给出的输出是: 虽然两个程序看起来都一样,但为什么输出有差异呢?为什么会这样?

  • SQL有以下优点: 快速 - 使用SQL查询,用户可以快速有效地从数据库中检索大量记录。 无需编码 - 在标准SQL中,管理数据库系统非常容易。它不需要大量代码来管理数据库系统。 明确界定标准 - ISO和ANSI是长期建立使用的SQL数据库标准。 可移植性 - SQL可用于笔记本电脑,PC,服务器甚至某些手机。 互动语言 - SQL是用于与数据库通信的域语言。 它还用于在几秒钟内接收复杂问题的答

  • 问题内容: 我们可以创建Docker映像并将所有映像都推送到没有Dockerfile的Hub中。拥有Dockerfile为何有用?它有什么优势?Dockerfile的创建是一个耗费大量时间的过程,只能由人来创建。我想知道基于基础映像,提交的映像和基于Dockerfile的映像之间的主要区别是什么。 问题答案: 通过指定我们要在docker映像上执行的所有步骤来用于工作自动化。 Dockerfile