Des messages d'erreurs avec mon code

Résolu
ulysse00 Messages postés 291 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 12 mai 2013 - 23 mai 2007 à 22:57
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 29 mai 2007 à 20:40
salut


voila le code qui contient des messages d'erreurs et je ne sais plus comment les enlever pour que le code ça foctionne


package aa;
import java.util.ArrayList;

class thread1
 {

 publicstaticArrayList methode(){
ArrayList A = newArrayList();
ArrayList B = newArrayList();
Thread m1_IOThread ;
Thread ATTEND;

       
m1_IOThread = newThread(){
 
publicvoid run(){
             try{
              A.add("ulysse00");
        }
             catch(Exception ex){
               System.out.println(ex);
             }
         
           }

         };
         m1_IOThread.setPriority(Thread.MIN_PRIORITY);
         m1_IOThread.start();
     
         ATTEND = newThread(){
                                  publicvoid run(){
                                 
                               
                                    while(m1_IOThread != null)
                                            {
                                      try{
                                        this.sleep(100);
                                      }
                                      catch(Exception G){}
                                    }
                                    B.add(A);
                                  }
     
         };
         ATTEND.setPriority(Thread.MIN_PRIORITY);
         ATTEND.start();

     return(B);
   }
 }

les messages d'erreurs sont
"thread1.java": local variable A is accessed from within inner class; needs to be declared final at line 19, column 15
"thread1.java": local variable m1_IOThread is accessed from within inner class; needs to be declared final at line 35, column 44
"thread1.java": local variable B is accessed from within inner class; needs to be declared final at line 42, column 37

sur la lignes
A.add("ulysse00");
et
B.add(A);

et la ligne while (m1_IOThread != null )

merci de bien vouloir m'aider

19 réponses

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
26 mai 2007 à 14:00
Salut:

Tu t'en sors bien, Félicitations.

Tu as commpis une petite faute d'inattention:

Changes while (ta.isAlive () && tb.isAlive ());

Par while (ta.isAlive () || tb.isAlive ());

J'espère que tu as compris pourquoi; Tantque le thread ta ou le thread tb sont en cours d'exécution alors on doit rester bloquer sur cette boucle.

Lorsque tu appelles la méthode start () alors tu es sûr que les threads sont en cours d'exécutions parallèlement avec le thread principal (main).
3
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
24 mai 2007 à 21:36
Salut:

Première remarque: Tu ne respectes pas la convention de nommage en Java.
"La première lettre du nom d'une variable doit être en minuscule".
Crois moi, ça aide beaucoup à lire aisément un code.

Pour ton problème, je pense que déja le compilateur t'a signalé ce qu'il faut faire.
"Il faut ajouter le modificateur final à la déclaration de tes variables locales".

allinurl%3AArrayList+java.sun.com&bntl=1 final ArrayList A = newallinurl%3AArrayList+java.sun.com&bntl=1 ArrayList();
final ArrayList B = newArrayList();
final Thread m1_IOThread ;




Proposition:
Si ces variables locales étaient par exemple des attributs de ta classe, pas de problème; ils sont belle et bien visibles au niveau des classes innées.
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
24 mai 2007 à 21:40
Salut:

Autre chose à dire, qui explique bien la cause de cette error de compilation.

Les variables locales sont créées dans la pile d'exécution de la méthode correspondantes.(Heap)

Par contre les attributs, ou les variables déclarées en tantque final sont allouées dans la pile d'exécution du tout le programme qui est le plus général et le plus global. (Tas)

J'espère avoir était clair (ICA).
0
ulysse00 Messages postés 291 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 12 mai 2013 1
24 mai 2007 à 22:06
merci pour cette information j'ai modifier le code mais ça marche pas
voila le code 

 
package aa;
import java.util.ArrayList;
 
class thread1
 {
 
 publicstaticArrayList methode(){
finalArrayList A = newArrayList();
finalArrayList B = newArrayList();
finalThread m1_IOThread ;
Thread ATTEND;
 
 
 
m1_IOThread = newThread(){
 
publicvoid run(){
             try{
              A=calcule.methode();
               System.out.println(A);
        }
             catch(Exception ex){
               System.out.println(ex);
             }
 
           }
 
         };
         m1_IOThread.setPriority(Thread.MIN_PRIORITY);
         m1_IOThread.start();
 
         ATTEND = newThread(){
                                  publicvoid run(){
 
 
                                    while(m1_IOThread != null)
                                            {
                                      try{
                                        this.sleep(100);
                                      }
                                      catch(Exception G){}
                                    }
 
                                    B.add(A);
System.out.println(B);
                                  }
 
         };
         ATTEND.setPriority(Thread.MIN_PRIORITY);
         ATTEND.start();
 
     return(B);
   }
 }

un message d'erreur :"thread1.java": cannot assign a value to final variable A at line 19, column 11

sur la ligne A=calcule.methode();

aidez moi
0

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

Posez votre question
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
24 mai 2007 à 22:44
Salut:

C'est logique, tu es en train d'affecter une nouvelle valeur à une variable constante qui a déja réçu une valeur.

final ArrayList A = new ArrayList (); // CECI EST LA PREMIERE AFFECTATION, OK

A = calcule.methode (); // CECI EST LA DEUXIEME AFFECTATION, ERREUR C'EST UNE VARIABLE CONSTANTE (final)

Pourquoi ne pas rendre ces variables en tantque attributs de ta classe de cette façon ils deviendront visibles et tu n'as pas à utiliser le modificateur final.

class ThreadExample {
    private ArrayList a = new ArrayList ();
    private ArrayList b = new ArrayList ();
    private Thread thread;

    public method () {
       thread = new Thread () {
          public void run () {
             // ...
          }
       };
    }
}
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
24 mai 2007 à 23:03
Salut:

Il y a une autre solution qui consiste à garder ces variables en tantque variables locales si tu ne veux pas les rendre des attributs de ta classe.

public class ThreadExample {
    public void method () {
       final ArrayList a = new ArrayList ();
      
final ArrayList b = new ArrayList ();
       final Thread thread = new Thread () {
          public void run () {
             // ...
             ArrayList temporary = calcule.methode ();
            
             a.clear ();
             for (int i = 0; i <
temporary
.size (); ++i) {
                a.add (
temporary
.get (i));
             }
            
             // ...
          }
       };

    }
}



Dans cette solution on ne change pas la référence dans la variable "a" mais on copie les valeurs d'un ArrayList à un autre.

Bonne chance ...
0
ulysse00 Messages postés 291 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 12 mai 2013 1
25 mai 2007 à 16:26
salut merci encore
salut
je voulais bien utiliser les threads
de cette façons

class thread
{
public static ArrayList methode() {

thread1 qui fait ArrayList A = calcule1.methode();
thread2 qui fait ArrayList B=calcule.methode();
les deux thread exicute en paralle
puis
thread3 qui fait
while (thread1 !=null &&)
{
try {
this.sleep(100);
}
catch (Exception G) {}
}
}
ArrayList C =new Arraylist();
C.add(A);
C.add(B);

return(C)
}
}

j'ai besoin de ça c'est urgent
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
25 mai 2007 à 21:44
Salut Ulysse:

Si j'ai bien compris ta problématique, tu veux exécuter deux threads en paraléles pour remplir les deux ArrayList A et B un fois ceci est terminé, on créer un troisième ArrayList C qui est la fusion de ces deux ArrayList.

ça semble à un programme producteur/consommateur.

Je vais essayer pour te trouver une solution (ICA).

Bye ...
0
ulysse00 Messages postés 291 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 12 mai 2013 1
25 mai 2007 à 22:06
merci encore ami , mais je voulais retourner return(C) car je vais l'utiliser dans une autre classe
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
25 mai 2007 à 22:13
Salut:

Peux tu me montrer exactement la façon avec laquelle tu remplis A et B?
C'est indispensable de savoir ça?

Je veux voir une petite trace d'exécution ou un exemple illustratif, ça permet ou moins de savoir ce qu'il faut faire.
0
ulysse00 Messages postés 291 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 12 mai 2013 1
25 mai 2007 à 22:17
ami je coince encore et je voulais bien que tu m'aide
voila
A = calcule1.methode();
B = calcule1.methode();

et C.add(A);
C.add(B);
pouis
lareturne(C);

comme l(exemple
package aa;
import java.util.ArrayList;
 
class thread1
 {
 
 publicstaticArrayList methode(){
finalArrayList A = newArrayList();
finalArrayList B = newArrayList();
finalThread m1_IOThread ;
Thread ATTEND;
 
 
 
m1_IOThread = newThread(){
 
publicvoid run(){
             try{
              A=calcule.methode();
               System.out.println(A);
        }
             catch(Exception ex){
               System.out.println(ex);
             }
 
           }
 
         };
         m1_IOThread.setPriority(Thread.MIN_PRIORITY);
         m1_IOThread.start();
 
         ATTEND = newThread(){
                                  publicvoid run(){
 
 
                                    while(m1_IOThread != null)
                                            {
                                      try{
                                        this.sleep(100);
                                      }
                                      catch(Exception G){}
                                    }
 
                                    B.add(A);
System.out.println(B);
                                  }
 
         };
         ATTEND.setPriority(Thread.MIN_PRIORITY);
         ATTEND.start();
 
     return(B);
   }
 }
0
ulysse00 Messages postés 291 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 12 mai 2013 1
26 mai 2007 à 12:21
 merci encore mes voila le code qui fonctionne mais je voulais confirmer si c'est just

package aa;
 
 
import java.util.ArrayList;
import java.util.Iterator;
 
 
class ThreadA extends Thread {
 
ArrayList A = new ArrayList ();
          public ArrayList getResultat(){
          A.add("ulysse");
          A.add("ulysse1");
             return(A);
           }
 
           publicvoid run(){
                    {
                      
                      Iterator IT = A.iterator();
                 while(IT.hasNext()){
                A.add(IT.next());
                                                }
 
                   }
           }
   }
 
   class ThreadB extends Thread {
 
     ArrayList B = new ArrayList ();
     public ArrayList getResultat(){
     B.add("ulysse3");
        return(B);
      }
 
      publicvoid run()
               {
 
                 Iterator IT = B.iterator();
            while(IT.hasNext()){
           B.add(IT.next());
           }
 
                  
           }
   }
 
 
publicclass  thread1 {
 
        publicstatic ArrayList calculParallele(){
                ArrayList C = new ArrayList();
                ThreadA ta = new ThreadA();
                ThreadB tb = new ThreadB();
 
                ta.start();
                tb.start();
 
                while(ta.isAlive() && tb.isAlive()){
                        try{
                                // on attend 100ms avant de retester
                                Thread.sleep(100);
                        }catch(InterruptedException e){
                                // on ne fait rien
                        }
                }
               
            
                Iterator IT = ta.getResultat().iterator();
     
                                 while(IT.hasNext()){
                                 C.add(IT.next());
                                     }
     
                                IT = tb.getResultat().iterator();
                                while(IT.hasNext()){
                                C.add(IT.next());
                                     }
 
                return(C);
        }
 
       
}
     
  j'ai doute avec run() de ThreadA et ThreadB est ce que c'est just

et est ce que les deux threadA et B fonctionne en parallele 
    
 
 
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
26 mai 2007 à 14:08
Salut:

Vaut miex mettre les sleep () dans les boucles de la méthode run que de faire ceci dans la boucle de blocage.

final ArrayList<String> arrayA = new ArrayList<String> ();
Thread ta = new Thread () {
   public void run () {
      int i = 0;
      while ( i < 10 ) {
         arrayA.add ("quelque chose");
         ++i;
         System.out.println ("Ici Thread 1 ...");
      }
   }
}; 

final ArrayList<String> arrayB = new ArrayList<String> ();
Thread tb = new Thread () {
   public void run () {
      int i = 0;
      while ( i < 20) {
         arrayB.add ("quelque chose");
         ++i;
         System.out.println ("Ici Thread 2 ...");
      }
   }
}; 

ta.start ();
tb.start ();

while (ta.isAlive () || tb.isAlive ()) {
   System.out.println ("Nous somme tous les deux bloqués ...");
}

System.out.println ("Enfin nous sommes libres ...");

// Le reste ...

Bye ...
0
ulysse00 Messages postés 291 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 12 mai 2013 1
26 mai 2007 à 14:34
salut ami merci pour la remarque .
mais j'ai encore soucis avec chaque thread a et b
par exemple
class ThreadA extends Thread {   ArrayList A = new ArrayList ();
          public ArrayList getResultat(){
          A.add("ulysse");
          A.add("ulysse1");
             return(A);
           }
 
           publicvoid run(){
                    {
                       
                   je voulais mettre quelque chose dans run mais je ne sais pas quoi je mettre  
                   }
           }
   }
et en plus je voulais rie toucher je garde cette partie
public ArrayList getResultat(){
          A.add("ulysse");
          A.add("ulysse1");
             return(A);
           }
modifier just run
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
27 mai 2007 à 00:10
Salut:

Je commence à ne pas comprendre ce que tu veux faire.
Dire Thread c'est dire la méthode run () si tu ne vas pas mettre du code dans cette méthode alors pourquoi utiliser les threads c'est inutile.

Bye ...
0
ulysse00 Messages postés 291 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 12 mai 2013 1
27 mai 2007 à 00:44
bonsoir
est ce que il y a une autre méthodes dans run de mes threads car  je ne sais pas quoi mettre dans run de chaque thread a et b j'ai doute avec run de thread a et b
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
27 mai 2007 à 13:17
Salut:

Avec les nouveaux changements que tu as ajouté à la source, franchement, je ne vois pas qu'elle est l'utilité d'utilier les threads maintenant.

On utilise généralement les threads pour faire reposer le thread principal des tâches lourdes et bloquantes.

Ici, ce n'est pas le cas.
Si tu étais en train de ceuillir les données à partir des fichiers ça serait vital.

Bye ...
0
ulysse00 Messages postés 291 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 12 mai 2013 1
29 mai 2007 à 18:05
merci ami j'ai bien compris les threads et j''ai résolu mon probleme merci encore
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
29 mai 2007 à 20:40
Salut:

J'étais très occupé.

Je pense que tu dois valider aussi une tes réponses, je n'ai corrigé qu'une petite erreur de frappe.

Cordialement ...
0
Rejoignez-nous