原文: https://javatutorial.net/java-parallel-streams-example

通过流 API,开发人员可以通过创建并行流并提高程序执行操作的速度来利用多核架构并提高 Java 程序的性能。

Java 并行流示例 - 图1

有两种创建并行流的方法:

  • 通过使用parallelStream()方法
  • 通过使用parallel()方法

当您使用并行流时,它们实际上会使用更多的 CPU 能力,这将使整个输出或处理(如果您愿意)的整体速度更快。 更快! 另外,如果您不使用并行流进行大型计算,则您的程序将仅使用 16 个内核中的 1 个内核。 多么低效!

顺序

并行流将问题分为多个小子集(或子问题),它们可以同时解决(不同于顺序排列的顺序,在这些子集中一个一个地执行每个小问题)。 在计算了子问题之后,将所有对它们的解决方案组合在一起。

如何实现

Java 允许您通过使用诸如 map 之类的聚合操作来实现并行流。

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class Main {
  4. public static int compute(int n) {
  5. for (int i = 0; i < 10000; i++) {
  6. n = n + i;
  7. }
  8. return n;
  9. }
  10. public static void main(String[] args) {
  11. ArrayList<Integer> arrayList = new ArrayList<>();
  12. for (int i = 0; i < 1000000; i++) {
  13. arrayList.add(i*6);
  14. }
  15. System.out.println("Added all the numbers to the arraylist.");
  16. System.out.println("Starting to add numbers...");
  17. int result = arrayList.parallelStream().map(i -> compute(i)).reduce(Integer::sum).get();
  18. System.out.println(reuslt);
  19. }
  20. }

在此示例中,我们有一个示例方法,该方法仅循环 10000 次并将i加到n。 最后,我们简单地返回n。 在我们的主要函数中,我们创建一个包含整数的ArrayList。 然后我们创建一个巨大的循环,循环 1000000 次,然后将每个增量i * 6加到arraylist中。 添加完之后,我们得到了这两个打印语句,它们指出这个大循环已经完成。

在这些打印语句下面是有趣的部分。 更具体地说,这是我们使用映射函数创建并行流的地方。 我们在arraylist上调用parallelStream(),对于arraylist中的每个i,我们都在调用计算函数,并将arraylist的元素作为参数传递。 最后,我们将所有结果结合在一起。

何时应使用并行流

  • 当有大量数据要处理时
  • 如果循序渐进的方法使您付出了代价
  • N(元素数量)Q(每元素成本)应大