0

Je souhaite ajouter deux matrices l'une à l'autre en utilisant un pool de threads pour que le processus se termine plus rapidement. Le programme fonctionne correctement lorsque je n'utilise pas l'infrastructure exécuteur pour l'ajout, mais se bloque lorsque j'implémente le pool de threads. Le problème doit être dans la méthode d'addition toute aide pour que cela fonctionne serait utile! Merci :).Ajout de matrices doubles (Matrix) ensemble à l'aide du pool de threads

Voici le code de la classe de matrice. Je n'ai pas inclus la classe principale car tout ce qu'elle fait c'est obtenir les dimensions pour créer la matrice. Si vous voulez aussi la classe principale faites le moi savoir et je l'inclurai.

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); 
    } 

Voici les erreurs que je reçois quand je tends la méthode d'addition:

Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task [email protected] rejected from [email protected][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 
+0

Cette est vraiment une mauvaise idée. – prasanth

Répondre

1

Il dit littéralement: "Arrêt" à l'exception.

Vous appelez la méthode shutdown() dans la boucle interne, ce qui signifie que vous essayez de soumettre de nouvelles tâches après les prochaines itérations après que le pool a déjà reçu la commande shutdown, et c'est pourquoi vous obtenez le rejet. exception.

Déplacez votre executor.shutdown(); en dehors du haut niveau pour boucle

+0

Haha je n'ai pas remarqué! Merci beaucoup J'ai passé les deux dernières heures à essayer de comprendre ce qui n'allait pas. – Art

0

Au lieu de créer et d'arrêter un pool de threads à plusieurs reprises, vous pourriez être mieux d'utiliser le construit en CommonForkJoinPool via parallèle flux

public Matrix addition (Matrix additionMatrix){ 
    int[][] matrixAddResult = new int[this.row][this.column]; 
    IntStream.range(0, row).parallel() 
      .forEach(i -> { 
       for (int j = 0; j < column; j++) 
        matrixAddResult[i][j] = this.matrixArray[i][j] 
              + additionMatrix.matrixArray[i][j]; 
       }); 
    return new Matrix(matrixAddResult); 
}