java - 使用线程池将双数组(矩阵)添加在一起

标签 java multithreading matrix executorservice threadpoolexecutor

我想使用线程池将两个矩阵相互添加,这将导致进程更快地完成。当我不使用执行器框架进行添加时,程序运行良好,但当我实现线程池时,程序崩溃了。问题必须出在添加方法中,任何帮助使其运行的帮助都会有所帮助!谢谢:)。

这是矩阵类的代码。我没有包含主类,因为它所做的只是获取创建矩阵的维度。如果您还想要主类,请告诉我,我会将其包含在内。

package matrixproject;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Matrix {
    int row;
    int column;

    int [][] matrixArray;

    public Matrix(){    
    }
    public Matrix (int numberofRows,int numberofColumns,int maxNumber,int minNumber){

        this.row = numberofRows;
        this.column = numberofColumns;

        matrixArray = new int [row][column];

        populateMatrix(minNumber,maxNumber);

    }
    public Matrix(int [][] matrixArrayCopy)
   {
       this.row = matrixArrayCopy.length;
       this.column = (matrixArrayCopy[0]).length;

       matrixArray = new int[row][column];

       for(int i=0; i<row; i++)
       {
           System.arraycopy(matrixArrayCopy[i], 0, matrixArray[i], 0, column);
       }
   }
     private void populateMatrix(int min, int max)
   {
       Random rand = new Random();

       for (int i=0; i<row; i++)
       {
           for (int j=0; j<column; j++)
           {
               matrixArray[i][j] = rand.nextInt((max - min) + 1) + min;
           }
       }
   }
    public Matrix addition (Matrix additionMatrix){
        int threadnum = Runtime.getRuntime().availableProcessors();
        ExecutorService executor = Executors.newFixedThreadPool(threadnum);
        int [][] matrixAddResult = new int [this.row][this.column]; 
        for (int i = 0; i <row; i+=1){
            for (int j =0; j <column; j+=1){
                //made new variables equal to i and j to get around needing a final variable for the lambda function 
                int index = i;
                int jndex = j;

                executor.submit(() -> {
                matrixAddResult[index][jndex] += this.matrixArray[index][jndex] + additionMatrix.matrixArray[index][jndex];

          });
            executor.shutdown();
            }
        }
        return new Matrix(matrixAddResult);
    }

以下是我在使用添加方法时遇到的错误:

Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@452b3a41 rejected from java.util.concurrent.ThreadPoolExecutor@4a574795[Shutting down, pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
    at matrixproject.Matrix.addition(Matrix.java:65)
    at matrixproject.MatrixProject.main(MatrixProject.java:73)
Java Result: 1

最佳答案

它的字面意思是:在异常中“关闭”。 :)

您在内循环中调用 shutdown() 方法,这意味着您尝试在池已经收到关闭命令后的下一次迭代中提交新任务,这就是为什么您收到拒绝异常(exception)情况。

executor.shutdown(); 移到顶级 for 循环之外

关于java - 使用线程池将双数组(矩阵)添加在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43301779/

相关文章:

java - 无法从 vector 得到矩阵

java - ubuntu中oracle jdeveloper的启动文件在哪里

java - 主线程中的异常。空指针异常

c# - 为什么我的线程完成后要花这么长时间才能退出?

swift - 如何找出哪个函数卡在主线程上

r - 用于计算(平方)马氏距离的矢量化代码

c++ - cuda:使用共享和全局的矩阵乘法

java - 使同一包中的另一个类只能访问变量

Java DOM : cannot write adapted XML to file

c++ - 如何在 C++ 应用程序中模拟高存储事件