Java中的并行和顺序方法有什么区别?

时间:2015-08-05 13:27:09

标签: parallel-processing java-8

我尝试使用Java 8编写当前代码。昨天我找到了下一个source的线性代数示例。在矩阵向量乘法的基础上(链接中的最后一个例子),我编写了我的所有者方法,用于矩阵的乘法。我的代码在这里:

import java.util.stream.IntStream;

public static void matrixMatrixProduct() {
    System.out.println("Matrix matrix mulptiplication");
    final int DIM1 = 15;
    final int DIM2 = 20;
    final int DIM3 = 2;

    int[][] a = new int[DIM1][DIM2];
    int[][] b = new int[DIM1][DIM3];
    int[][] c = new int[DIM3][DIM2];
    int counter = 1;
    for (int i =0; i < DIM1; i++) {
        for (int j =0; j < DIM3; j++) {
            b[i][j] = counter++;
        }
    }

    for (int i =0; i < DIM3; i++) {
        for (int j =0; j < DIM2; j++) {
            c[i][j] = counter++;
        }
    }

    System.out.println("");
    System.out.println("Print matrix b");
    System.out.println("");
    for (int i = 0; i < DIM1; i++) {
        for (int j = 0; j < DIM3; j++) {
            System.out.print(b[i][j] + " ");
        }
        System.out.print("\n");
    }
    System.out.println("");
    System.out.println("Print matrix c");
    System.out.println("");
    for (int i = 0; i < DIM3; i++) {
        for (int j = 0; j < DIM2; j++) {
            System.out.print(c[i][j] + " ");
        }
        System.out.print("\n");
    }

    IntStream.range(0, DIM1)
        .parallel()
        .forEach( (i) -> {
            IntStream.range(0,  DIM2)
            .sequential()
            .forEach( (j) -> { 
                IntStream.range(0, DIM3)
                .parallel()
                .forEach( (k) -> {
                    a[i][j] += b[i][k]*c[k][j]; 
                });
             });
          });

    System.out.println("");
    System.out.println("Print matrix a");
    System.out.println("");
    for (int i = 0; i < DIM1; i++) {
        for (int j = 0; j < DIM2; j++) {
            System.out.print(a[i][j] + " ");
        }
        System.out.print("\n");
    }

我的问题是,通过调用parallel()类,sequential()IntStream方法之间的区别是什么? (实际上这是最重要的部分,我明确地进行乘法)。基于这些知识,我想知道,在上一次IntStream调用中,正确的用法是什么。目前我在这个地方定义了方法parallel(),但我不确定这是一个正确的解决方案......实际上,如果我将parallel()更改为sequential()我就不会# 39;看不出输出的差异。

1 个答案:

答案 0 :(得分:1)

并行操作同时发生。这意味着可以同时处理流的元素。

顺序操作一次发生一次。

sequential()更改为parallel()对结果没有影响,因为您的操作与状态无关,但可能会影响您的运行时间。但是,如果您执行的操作会影响将来的操作,那么您应该考虑使用sequential()

我认为你希望矩阵运算并行发生,但我对数学并不太熟悉。

链接到Javadoc,由@ the8472引用。