Java “四处走动”;“最终或有效最终”;在内部类中,会给出非常随机的结果

Java “四处走动”;“最终或有效最终”;在内部类中,会给出非常随机的结果,java,lambda,parallel-processing,Java,Lambda,Parallel Processing,我正在做一个编程类项目,用于400行矩阵的矩阵乘法。我让它在顺序模式下工作,项目的目标是编写一个并行实现 我有下面的代码,当然,当我试图引用内部类中的计数器j时,我得到一个关于j必须是“final或effectivefinal”的错误。我发现这个解决方法是使用最后一个数组,但更改了第一个元素,但它会产生非常不可预测的结果,我本以为它会从0计数到399,但它会以随机顺序吐出数字,然后多次重复很多数字,包括399 你知道如何在内部类中使用递增计数器吗?我们的目标是调用该方法来处理内部类中矩阵中每一行

我正在做一个编程类项目,用于400行矩阵的矩阵乘法。我让它在顺序模式下工作,项目的目标是编写一个并行实现

我有下面的代码,当然,当我试图引用内部类中的计数器j时,我得到一个关于j必须是“final或effectivefinal”的错误。我发现这个解决方法是使用最后一个数组,但更改了第一个元素,但它会产生非常不可预测的结果,我本以为它会从0计数到399,但它会以随机顺序吐出数字,然后多次重复很多数字,包括399

你知道如何在内部类中使用递增计数器吗?我们的目标是调用该方法来处理内部类中矩阵中每一行的矩阵乘法,因为我们应该有与矩阵中的行一样多的线程。谢谢你的帮助

代码如下:

private static double parallelMatrixMultiply()
{
    // use the existing arrays A and B, multiply them together
    // use the parallel approach
    // Create a fixed thread pool with maximum of three threads
    ExecutorService executor = Executors.newFixedThreadPool(numRows);

    final int[] counter = new int[]{0};

    // submit a new thread for each row in the matrix
    for (int j = 0; j < numRows ; j++)
    {
        // we can modify an element of an array that has been declared final
        counter[0] = j;
        // Submit runnable tasks to the executor
        executor.execute(new Runnable() {
            public void run() 
            {
                // set a task to multiply for each row here
                // will be replaced by a line to multiply each row of matrix
                System.out.println(counter[0]);
            }
        });
    }

    // Shut down the executor
    executor.shutdown();

    // return the value of the 1,1 position on zero notation
    //return matrixC.get(1).get(1); // return matrixC(1,1)
    return 42.0;
}
private静态双并行矩阵multiply()
{
//使用现有数组A和B,将它们相乘
//使用并行方法
//创建最多包含三个线程的固定线程池
ExecutorService executor=Executors.newFixedThreadPool(numRows);
最终int[]计数器=新int[]{0};
//为矩阵中的每一行提交一个新线程
对于(int j=0;j
计数器
是您可以在回调方法中使用的最后一个变量。但是数组的内容不是最终的,您会不断更改它们。调用
run()
方法时,它将查看当时
计数器[0]
保持的任何值,而不是调用
execute
时循环中的点

您最好这样做:

for (int j = 0; j < numRows ; j++) {
    final int finalj = j;
    executor.execute(new Runnable() {
        public void run() {
            System.out.println(finalj);
        }
    });
}
for(int j=0;j

也就是说,将循环计数器的值分配给回调方法要使用的实际最终变量。

计数器是可在回调方法中使用的最终变量。但是数组的内容不是最终的,您会不断更改它们。调用
run()
方法时,它将查看当时
计数器[0]
保持的任何值,而不是调用
execute
时循环中的点

您最好这样做:

for (int j = 0; j < numRows ; j++) {
    final int finalj = j;
    executor.execute(new Runnable() {
        public void run() {
            System.out.println(finalj);
        }
    });
}
for(int j=0;j

也就是说,将循环计数器的值分配给回调方法要使用的实际最终变量。

计数器是可在回调方法中使用的最终变量。但是数组的内容不是最终的,您会不断更改它们。调用
run()
方法时,它将查看当时
计数器[0]
保持的任何值,而不是调用
execute
时循环中的点

您最好这样做:

for (int j = 0; j < numRows ; j++) {
    final int finalj = j;
    executor.execute(new Runnable() {
        public void run() {
            System.out.println(finalj);
        }
    });
}
for(int j=0;j

也就是说,将循环计数器的值分配给回调方法要使用的实际最终变量。

计数器是可在回调方法中使用的最终变量。但是数组的内容不是最终的,您会不断更改它们。调用
run()
方法时,它将查看当时
计数器[0]
保持的任何值,而不是调用
execute
时循环中的点

您最好这样做:

for (int j = 0; j < numRows ; j++) {
    final int finalj = j;
    executor.execute(new Runnable() {
        public void run() {
            System.out.println(finalj);
        }
    });
}
for(int j=0;j

也就是说,将循环计数器的值分配给回调方法要使用的实际最终变量。

我确实搜索了,但没有找到基于并行/线程的问题,很快就要睡觉了,谢谢!我做了搜索,但没有找到这个基于并行/线程的问题,很快就要睡觉了,谢谢!我做了搜索,但没有找到这个基于并行/线程的问题,很快就要睡觉了,谢谢!我做了搜索,但没有找到这个基于并行/线程的问题,很快就要睡觉了,谢谢!棒极了,它可以工作,它不会按顺序打印出数字,但在这种情况下,这是不相关的。对于另一个似乎被删除的答案,我将研究AtomicInteger,但我会尽快选择正确的答案。谢谢我删除的答案与您将在executor任务中更改计数器的假设有关。如果每个任务都需要一个不可变的值,那么这个答案是合适的。太棒了,它可以工作,它不会按顺序打印数字,但在这种情况下,这是不相关的。给另一个answe