如果您听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密集型操作,但是我们也可