smahaneAAI
Messages postés68Date d'inscriptionjeudi 27 janvier 2011StatutMembreDernière intervention 7 février 2014
-
11 nov. 2012 à 22:47
smahaneAAI
Messages postés68Date d'inscriptionjeudi 27 janvier 2011StatutMembreDerniè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()
smahaneAAI
Messages postés68Date d'inscriptionjeudi 27 janvier 2011StatutMembreDernière intervention 7 février 201410 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 :
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.
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.