La Multiplication de matrice avec des threads Java

Je suis en train de créer un programme Java avec des fils pour la multiplication matricielle. C'est le code source:

import java.util.Random;
public class MatrixTest {
//Creating the matrix
static int[][] mat = new int[3][3];
static int[][] mat2 = new int[3][3];
static int[][] result = new int[3][3];
public static void main(String [] args){
//Creating the object of random class
Random rand = new Random();
//Filling first matrix with random values
for (int i = 0; i < mat.length; i++) {
for (int j = 0; j < mat[i].length; j++) {
mat[i][j]=rand.nextInt(10);
}
}
//Filling second matrix with random values
for (int i = 0; i < mat2.length; i++) {
for (int j = 0; j < mat2[i].length; j++) {
mat2[i][j]=rand.nextInt(10);
}
}
try{
//Object of multiply Class
Multiply multiply = new Multiply(3,3);
//Threads
MatrixMultiplier thread1 = new MatrixMultiplier(multiply);
MatrixMultiplier thread2 = new MatrixMultiplier(multiply);
MatrixMultiplier thread3 = new MatrixMultiplier(multiply);
//Implementing threads
Thread th1 = new Thread(thread1);
Thread th2 = new Thread(thread2);
Thread th3 = new Thread(thread3);
//Starting threads
th1.start();
th2.start();
th3.start();
th1.join();
th2.join();
th3.join();
}catch (Exception e) {
e.printStackTrace();
}
//Printing the result
System.out.println("\n\nResult:");
for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result[i].length; j++) {
System.out.print(result[i][j]+" ");
}
System.out.println();
}
}//End main
}//End Class
//Multiply Class
class Multiply extends MatrixTest {
private int i;
private int j;
private int chance;
public Multiply(int i, int j){
this.i=i;
this.j=j;
chance=0;
}
//Matrix Multiplication Function
public synchronized void multiplyMatrix(){
int sum=0;
int a=0;
for(a=0;a<i;a++){
sum=0;
for(int b=0;b<j;b++){
sum=sum+mat[chance][b]*mat2[b][a];
}
result[chance][a]=sum;
}
if(chance>=i)
return;
chance++;
}
}//End multiply class
//Thread Class
class MatrixMultiplier implements Runnable {
private final Multiply mul;
public MatrixMultiplier(Multiply mul){
this.mul=mul;
}
@Override
public void run() {
mul.multiplyMatrix();
}
}

J'ai juste essayé sur Eclipse et il fonctionne, mais maintenant, je veux créer une autre version de ce programme dans lequel, j'utilise un thread pour chaque cellule que je vais avoir sur le résultat de la matrice. Par exemple, j'ai deux matrices 3x3. De sorte que le résultat matrice 3x3. Alors, je veux utiliser 9 fils pour calculer chacun des 9 cellules de la matrice de résultats.

Quelqu'un peut m'aider?

En Ce Qui Concerne Meilleur

Je suis sûr que quelqu'un peut vous aider! Quels sont-ils vous aider à atteindre?
J'ai besoin d'aide à propos de la synchronisation de thread, parce que dans ce cas, je suis en utilisant seulement 3 fil. Dans l'autre programme que je veux utiliser pour 9 ou plusieurs fil (quand j'aurai de la matrice plus grande que 3x3) un pour chaque cellules. Je pense que j'ai besoin de créer une cellule de la classe, mais pour le moment je n'ai pas d'autres idées
Si vous êtes à la recherche d'un moyen de créer n fils où n est le nombre de cellules il y a?
oui, bien sûr!!
Si vous souhaitez créer un thread pour calculer une seule cellule d'une matrice? Pause votre programme de sorte qu'il a un appel de fonction qui permettent de calculer une seule cellule, puis invoquer qu'à partir de plusieurs threads comme vous l'avez fait ci-dessus pour l'ensemble de la matrice. ATTENTION ne vous attendez pas cette course rapide, les threads sont assez lourds de poids et vous allez souffrir de faux partage au sein de l'caches CPU. La version que vous avez est plus concurrentes que vous pouvez réaliser grâce au parallélisme interne de l'UC et de l'utilisation croissante des instructions SIMD à partir de Hotspot.

OriginalL'auteur WhatElse88 | 2015-09-03