在使用Java并行流之前要三思而后行

本文探讨了Java并行流的使用,虽然并行流简化了代码并能利用多核CPU,但存在公共线程池可能导致的问题。当长时间运行的任务阻塞线程池时,其他并行流任务可能会受到影响。在Servlet环境中,这种情况尤为严重,因为不同请求可能需要不同的资源。解决方案包括确保任务不阻塞或等待Oracle提供指定线程池的能力。
摘要由CSDN通过智能技术生成

如果您听Oracle的人谈论Java 8背后的设计选择,您会经常听到并行是主要动机。并行化是lambda,流API和其他背后的驱动力。让我们看一下流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和最大值之间的质数。通过范围方法创建数字流。然后将流切换到并行模式。不是质数的数字将被过滤掉,剩余的数字将被计数。
您会看到流API使我们能够以简洁明了的方式描述问题。而且,并行化只是调用该 parallel() 方法的问题。当我们这样做时,流被分成多个块,每个块被独立处理,并在最后汇总结果。由于我们对该isPrime 方法的实现 效率极低且占用大量CPU,因此我们可以利用并行化的优势并利用所有可用的CPU内核。
让我们看另一个例子:

private List getStockInfo(Stream symbols) {
return symbols.parallel()
.map(this::getStockInfo) //slow network operation
.collect(toList());
}
我们在输入中列出了股票代号列表,我们必须调用慢速网络操作来获取有关股票的一些详细信息。在这里,我们不处理CPU密集型操作,但是我们也可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值