Problème Thread en java

Problème Thread en java - Java - Programmation

Marsh Posté le 13-10-2004 à 14:40:35    

Salut tout le monde,
 
j'ai un petit problème avec les threads en java voici le code
 

Code :
  1. package labo3thread;
  2. class MyThread implements Runnable{
  3.     public int nba;
  4.     public int nbb;
  5.    
  6.     public MyThread(int n1,int n2){
  7.         nba=n1;
  8.         nbb=n2;
  9.     };
  10.    
  11.     public MyThread(){
  12.        
  13.     };
  14.    
  15.     public void run() {
  16.      System.out.println("Je suis dans la thread resultat : " + nba + nbb);
  17.      nba=50;
  18.      nbb=50;
  19.    
  20.     }
  21. }
  22. public class labo3thread {
  23.    
  24.     public labo3thread() {
  25.     }
  26.    
  27.    
  28.     public static void main(String[] args) {
  29.         int i,j;
  30.         int a,b;
  31.         int [] tabint = new int[2];
  32.         tabint[0]=7;
  33.         tabint[1]=7;
  34.      
  35.         MyThread[] mt = new MyThread[8];
  36.         Thread[] TabThread = new Thread[8];
  37.         a=b=0;
  38.         mt[0] = new MyThread(a,b);
  39.         TabThread[0] = new Thread(mt[0]);
  40.        
  41.         mt[1] = new MyThread(tabint[0],tabint[1]);
  42.         TabThread[1] = new Thread(mt[1]);
  43.        
  44.       /*  int[][] Mat1 = new int [4][4];
  45.         int[][] Mat2 = new int [4][4];
  46.          
  47.         for(i=0;i<4;i++){
  48.             for(j=0;j<4;j++){
  49.                 Mat1[i][j]=i+1;
  50.                 Mat2[i][j]=j+1;
  51.             }
  52.         }*/
  53.         TabThread[0].start();
  54.         TabThread[1].start();
  55.         try{
  56.         for(i=0;i<2;i++){
  57.             TabThread[i].join();       
  58.         }
  59.         }
  60.         catch(Exception e){
  61.         }
  62.         System.out.println("resu" + a + b);
  63.         System.out.println("resu" + tabint[0] + tabint[1]);
  64.        
  65.         // TODO code application logic here
  66.     }
  67. }


 
et les résultat

Code :
  1. Je suis dans la thread resultat : 00
  2. Je suis dans la thread resultat : 77
  3. resu00
  4. resu77


 
Je n'arrive pas a passer les handler de mes deux entier a et b déclarés dans le main pour qu'ils puissent modifié depuis la thread ! J'ai essayer avec un tableau marche pas non plus !
Ou ce trouve les variables partagée entre le main et les threads a la création d'une thread le main devient pas une thread comme en C ?
 
Merci


Message édité par tomsawyer121 le 13-10-2004 à 14:44:20
Reply

Marsh Posté le 13-10-2004 à 14:40:35   

Reply

Marsh Posté le 13-10-2004 à 15:51:00    

T'attendais quoi de ton programme ?
T'as créés 2 instances distincts de MyThread donc elle ne partage rien comme attribut.

Reply

Marsh Posté le 13-10-2004 à 16:07:29    

C'esr bien ce qui me semblait je peut mettre le main du prog dans la class qui implements runnable ?
Comme ca je peut faire plusieurs thread qui on le main en commun !
 
T'en pense quoi ?


Message édité par tomsawyer121 le 13-10-2004 à 16:32:06
Reply

Marsh Posté le 13-10-2004 à 16:32:24    

En gros si je résume tu veux simplement partager les attributs pour tes threads ?
 
Le plus propre c'est de mettre ton nba et nbb dans la classe du main, en private, avec des getter et setter. Ensuite tu construit les threads non pas avec les valeurs de ces nombres, mais en passant ta classe principale comme attribut

Code :
  1. class MyThread implements Runnable {
  2.   private Labo3Thread labo;
  3.   public MyThread(Labo3Thread lab) { this.labo = lab; }
  4.   public void run {
  5.     System.out.println("Je suis dans la thread resultat : " + labo.getNba() + labo.getNbb()); 
  6.     labo.setNba(50);
  7.     labo.setNbb(50);
  8.   }
  9. }
  10. public class Labo3Thread {
  11.   private int nba;
  12.   private int nbb;
  13.   public int getNba() { return nba; }
  14.   public int getNbb() { return nbb; }
  15.   public int setNba(int nba) { this.nba = nba; }
  16.   public int setNbb(int nbb) { this.nbb = nbb; }
  17.   public static void main(String[] args) {
  18.     /* identique sauf pour les créations des threads : new MyThread(this) /*
  19.   }
  20. }


 
Dis moi si ca te convient
 
Bill


Message édité par bill.fr le 13-10-2004 à 16:33:57

---------------
On ne vit qu'une fois, mais pour qui sait vivre, une seule fois suffit (Merril Stubbing)
Reply

Marsh Posté le 13-10-2004 à 17:32:06    

Salut bill,
 
je comprend bien ton prog, oui c'est une facon de faire mais je ne saisi pas bien la notion de l'espace mémoire partagé alors dans ce cas si y'en a pas étant donné que tu passe le main à la thread ! On ne peut pas déclarer la méthode run ainsi que le main dans la même class un peu comme ca :
 

Code :
  1. public class test implements Runnable {
  2.    
  3.     /** Creates a new instance of test */
  4.     public test() {
  5.     }
  6.    
  7.     static Thread MyThread;
  8.     static int compteur;
  9.    
  10.     void addcompteur(){
  11.         compteur = compteur + 1000;
  12.     }
  13.    
  14.     public static void main(String[] args) {
  15.         MyThread = new Thread();
  16.         MyThread.start();
  17.         try{
  18.         MyThread.join();
  19.         }
  20.         catch(Exception e){
  21.             System.out.println("exception sur join" );
  22.         }
  23.         System.out.println("dans main" + compteur);
  24.     }
  25.     public void run() {
  26.         int nb1;
  27.         nb1=8;
  28.    //     addcompteur();
  29.         System.out.println("in run" + nb1);
  30.     }
  31. }


 
De cette facon les variable de la class test sont commune au thread et a la class main. C'est possible que ca tourne dans ce style la ?  
 
Merci

Reply

Marsh Posté le 13-10-2004 à 18:24:25    

Je crois que ton bout de code est 1 peu bidon.
Tu ne dois pas penser en terme d'espace mémoire partagée mais en terme d'objet partagé.

Reply

Marsh Posté le 13-10-2004 à 20:51:22    

Bon, je suis qu'un sale ex-codeur C++, mais ça me choque tout ça. Il faudrait pas:
1. creer une classe Toto, avec 2 champs a et b.
2. créer une instance de toto dans le main()
3. démarrer le Run, en passant toto aux threads.
4. Et les threads n'ont plus qu'à faire:
synchronized totoInstance {
   totoInstance.a = 23;
}
 
Ou bien je me gourre comme une grosse merde ?

Reply

Marsh Posté le 13-10-2004 à 21:06:50    

J'y capte rien à ton bordel. Je vois pas les besoins, les choix, et le "vocabulaire" est trop technique.
 
 
je vois qu'une seule chose : tu as implémenté Runnable au-lieu de souclasser Thread, et c'est bien.
 
 
 
 
 
 
(nan, moi j'ai sous-classé thread pour lui rajouter un champ, c'est pas pareil)


---------------
trainoo.com, c'est fini
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed