Calcule de produit matriciel des matrices carrés avec les threads

Résolu
smahaneAAI Messages postés 68 Date d'inscription jeudi 27 janvier 2011 Statut Membre Dernière intervention 7 février 2014 - 11 nov. 2012 à 22:47
smahaneAAI Messages postés 68 Date d'inscription jeudi 27 janvier 2011 Statut Membre Dernière intervention 7 février 2014 - 14 nov. 2012 à 00:34
Bonsoir tout le monde!
j'ai un souci à ce qui concerne les threads en java.
alors mon programme consiste à faire le calcul de deux matrices qui sont enregistrés déjà dans deux fichiers chacun est dans un fichier(là j'ai séparé entre les numéros des matrices avec des ";"). ces deux matrices sont carrés et se composent de 4 lignes et 4 colonnes pour chacun et on calcule leur produit qui va être enregistré par la suite dans un fichier déjà existant aussi dans notre projet java. Donc le calcule doit d’effectué en découpant d'abord chacun des deux matrices sur quatre parties (2 par 2) pour que le calcule du produit se devise sur 4 processus (chaque processus calcule une partie de la matrice résultante):

Alors voilà j'ai 3 class: class "Produit" où se trouve le calcule et qui hérite de la class thread, class "file" où se trouve des méthodes pour faire la lecture et l'écriture des fichiers ,et en fin la class "Test" qui contient le main .
j'ai 3 fichiers :
le 1er "m1.txt" =>contient le 1ere matrice
le 2em "m2.txt" =>contient la 2eme matrice
le 3em "m_rst.txt" =>contient la matrice resultante

exp de matrice :
1;2;4;12
12;2;5;7
5;8;9;4
0;1;6;8

class "file":

import java.io.*;

public class file {

private String nomfich;
private String sm1 [][]=new String[2][2];//Sous Matrice 1 
private String sm2 [][]=new String[2][2];//Sous Matrice 2
private String sm3 [][]=new String[2][2];//Sous Matrice 3 
private String sm4 [][]=new String[2][2];//Sous Matrice 4 

public file(String nomfich){
this.nomfich=nomfich;
}	
public file(){} //constructeur

public  void Decoupage() throws IOException {
// lire une matrice à partir d'un fichier .txt et la divisé en 4  tableaux 

String ligne ;		
BufferedReader entree = new BufferedReader (new FileReader (nomfich)) ;
       String t[][];
       int j=0;
       t=new String[4][4];
do
{ ligne = entree.readLine() ;
if (ligne != null){

t[j]=ligne.split(";");
j++;
   }
}
while (ligne != null) ;
entree.close () ;

for(int i=0;i<=1;i++){
for (int k=0;k<=1;k++){
sm1[i][k]=t[i][k];
sm2[i][k]=t[i][k+2];
sm3[i][k]=t[i+2][k];
sm4[i][k]=t[i+2][k+2];
}}}
public String[][] getSM1(){
return sm1;
}
public String[][] getSM2(){
return sm2;
}
public String[][] getSM3(){
return sm3;
}
public String[][] getSM4(){
return sm4;
}
public synchronized static void Resultat(String R1[][],String R2[][],String R3[][],String R4[][]) throws IOException{
PrintWriter resultat;
resultat = new PrintWriter (new FileWriter ("m_rst.txt"));
for (int i=0;i<2;i++){
for (int j=0;j<1;j++){
resultat.println(R1[i][j]+" ; "+R1[i][j+1]+" ; "+R2[i][j]+" ; "+R2[i][j+1]);
}		
}
for (int i=0;i<2;i++){
for (int j=0;j<1;j++){
resultat.println(R3[i][j]+" ; "+R3[i][j+1]+" ; "+R4[i][j]+" ; "+R4[i][j+1]);
}
}
resultat.close();	
}
public void afficher() throws IOException {
System.out .println("----- "+nomfich+"-----");
String ligne ;		
BufferedReader entree = new BufferedReader (new FileReader (nomfich)) ;
       String t[][];
       int j=0;
       t=new String[4][4];
do
{ ligne = entree.readLine() ;
if (ligne != null){

System.out.println(ligne);
   }
}
while (ligne != null) ;
entree.close () ;
System.out .println("----- Fin Matrice -----");
}}



et voilà la class "Produit":

import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class Produit extends Thread{

 String M1[][]=new String[2][2];
 String M2[][]=new String[2][2];
 String resultat[][]=new String[2][2];
 
public Produit(String M1[][],String M2[][]){
this.M1=M1;
this.M2=M2;

}	
public void run() {

int produit ;
for (int i=0;i<2;i++){

for (int j=0;j<2;j++){
produit=0;
for (int k=0;k<2;k++){
produit=produit+(Integer.parseInt(M1[i][j])*Integer.parseInt(M2[i][k]));
}
resultat[i][j]=String.valueOf(produit);

}	}}
}


et en fin la class "Test":

import java.io.*;
import java.util.Scanner;

public class Test {

public static void main(String[] args) throws IOException {

Scanner sc = new Scanner(System.in);
int choix;
String rep="oui";
file f1=new file();
file f2=new file();


//sleeeeeeeeep*************
try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    //**************************

do{

System.out.println("^^^^^^^^^^^Calcule produit matriciel^^^^^^^^^^");
System.out.println(" 1=> Afficher les matrices");
System.out.println(" 2=> Calculer le produit des deux matrices");
System.out.println(" 3=> Afficher le résultat");
System.out.println("-----------------------");

choix=sc.nextInt();

switch(choix){

   case 1 :			
   f1=new file("m1.txt");
       f2=new file("m2.txt");
       f1.afficher();
       f2.afficher();
   break;
   
   case 2 :   				   
   f1.Decoupage();
   f2.Decoupage();
   
Produit P1=new Produit(f1.getSM1(),f2.getSM1());
Produit P2=new Produit(f1.getSM2(),f2.getSM2());
Produit P3=new Produit(f1.getSM3(),f2.getSM3());
Produit P4=new Produit(f1.getSM4(),f2.getSM4());

//Démarage des 4 processus 
P1.start();
P2.start();
P3.start();
P4.start();

//La création des résultats dans un fichier txt
file.Resultat(P1.resultat, P2.resultat, P3.resultat, P4.resultat);
break;
   
   case 3 :
   file prd=new file("m_rst.txt");
   prd.afficher();
   break;			
}
System.out.println("Voulez-vous continuer  Oui/Non !!");
rep=sc.next();

}while(rep!="oui");		
}}



Je crois que le probleme est dans la class du Test lors de l'utilisation de methose start()

Heeeeeeelp

Merci

6 réponses

smahaneAAI Messages postés 68 Date d'inscription jeudi 27 janvier 2011 Statut Membre Dernière intervention 7 février 2014 10
12 nov. 2012 à 23:42
Bonsoir,

c'est bon merci à tous et à toutes
j'ai trouvé la solution

Alors voilà, il fallait juste ajouter la ligne suivante: "this.start()" dans le constructeur de la class "Produit", et donc dans la class "Test" au lieu de mettre "P1.start();" on met "P1.join();" et c'est la même chose pour les autres objets P2 et P3 et P4. puis ça va vous demandez d'ajouter un catch pour le main et donc ça devient :
public static void main(String[] args) throws IOException, InterruptedException {
// ...
}
1
Utilisateur anonyme
12 nov. 2012 à 00:56
Bonsoir

Vous devriez plutôt implémenter Runnable au lieu d'hériter de Thread. Ensuite, utilisez la méthode join() pour attendre que chaque thread ait fini sa tâche. Cette méthode n'a d'intérêt que si le thread attendu n'est pas déjà mort bien évidemment.











T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
smahaneAAI Messages postés 68 Date d'inscription jeudi 27 janvier 2011 Statut Membre Dernière intervention 7 février 2014 10
12 nov. 2012 à 20:29
d'accord je vais l'essayer espérons que ça marchera
Mais c'est quoi la différence entre l’implémentation et l'héritage dans ce cas ???
0
smahaneAAI Messages postés 68 Date d'inscription jeudi 27 janvier 2011 Statut Membre Dernière intervention 7 février 2014 10
12 nov. 2012 à 20:52
ça marche pas

j'ai fait l'implémentation mais je n'ai pas utilisé join() puisque je ne crois pas que j'en ai vraiment besoin

et donc j'ai fait mon start de la correcte façon: new Thread(P1).start(); par exemple , mais ça marche paaaas
Helppppppp
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
13 nov. 2012 à 16:49
Bonjour

Ajouter this.start() dans le constructeur de la classe Produit revient quasiment au même que ce que vous faisiez déjà. Il manquait bien les appels à join(). Vous n'avez simplement pas besoin d'hériter directement de Thread, vous pourriez passer votre implémentation de Runnable à un thread, ce serait suffisant. Je vous avais mis un lien vers la documentation de la méthode join() pour que vous essayez de comprendre à quoi elle sert, j'espère que vous y voyez plus clair désormais.















T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
smahaneAAI Messages postés 68 Date d'inscription jeudi 27 janvier 2011 Statut Membre Dernière intervention 7 février 2014 10
14 nov. 2012 à 00:34
Merciiii j'ai lu la documentation et ça m'a bien servir


Merci pour tout
0
Rejoignez-nous