IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

manipuler un thread avec des objets agents


Sujet :

Java

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 131
    Points : 93
    Points
    93
    Par défaut manipuler un thread avec des objets agents
    Salut;
    enfaîte mon problème c'est que comment je peux lancer ou arrêter un thread au niveau d'une classe qui hérite d'un JFrame et instanciée par une classe qui hérite d'un Agent ,tout simplement j'ai deux agents qui communiquent entre eux par des messages ACL, un il envoie un message et l'autre le reçoit dont ce dernier va le traiter selon son contenu si l’entête du message vaut "stop" il affiche un message et il s’arrête et si vaut "start" il reste en boucle infinie pour afficher un message
    voilà ce que le compilateur m'affiche.
    *** Uncaught Exception for agent LA2 ***
    java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Thread.java:682)
    at local_agent_2.LA2.start(LA2.java:2652)
    at local_agent_2.AgentL2$1.action(AgentL2.java:65)
    at jade.core.behaviours.Behaviour.actionWrapper(Behaviour.java:344)
    at jade.core.Agent$ActiveLifeCycle.execute(Agent.java:1552)
    at jade.core.Agent.run(Agent.java:1491)
    at java.lang.Thread.run(Thread.java:722)


    et voici maintenant le code de l'agent récepteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    public class AgentL2 extends jade.gui.GuiAgent {
         transient protected LA2 Interface_la;
     
     
          public AgentL2() {
            this.Interface_la = new LA2(this);
          }
            protected void setup() {
    // Printout a welcome message
            Interface_la = new LA2(this);
            Interface_la.setVisible(true);
     
            System.out.println("Hello! my name is Agent " + getAID().getName() + " is ready.");
            String localname = "LA2";
            AID id = new AID(localname, AID.ISLOCALNAME);
     
     
            DFAgentDescription dfd = new DFAgentDescription();
            dfd.setName(id);
               addBehaviour(new CyclicBehaviour(this) {
                public void action() {
     
                        ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
     
                      ACLMessage msg = receive();
     
                       if (msg != null) {
                       System.out.println("j'ai reçu");
                       String tab[]= msg.getContent().toString().split("#"); //  pour récupérer l’entête du message puisque est codé de cette manière entête#contenu   
                        if(tab[0].equals("stop"))
                                Interface_la.stop(msg);
     
                       else 
                                Interface_la.start(msg);
                 }else
                    block();
                }
            }); 
     
        }}
    le code de la classe LA2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    public class LA2 extends javax.swing.JFrame {
    /..............................
    ................./
       public LA2(AgentL2 a) {
            this.la = a;
     
            initComponents();
    }
     
          ACLMessage msg;  
              Runnable tache = new Runnable() {
          public void run() {
                 String[] h = msg.getContent().split("#"); 
     
            String heading = h[0];
     
            switch (heading) {
                            case "stop": {
                             System.out.println("***********************************************Stop****************************");    
     
                          }break;
                     case "start": {
     
                        int i=0;
                         while(true){
                          System.out.println("BONJOUR"+i);
                          i++;
                         }
                     }}  
          }};  
                Thread thread = new Thread(tache);
      public void start(ACLMessage msg){
          this.msg=msg;
     
        thread.start();
      }
        public void stop(ACLMessage msg){
             this.msg=msg;
            thread = new Thread(tache);
     
        thread.interrupt();
      }
    /......................................
    ....................../
    }
    NOTE : la tache est considérée comme un thread et elle peut traiter plusieurs cas c'est juste un exemple afin de vous montrer que dans le cas non "stop" il fait ses traitement normalement
    Merci d'avance et bien cordialement

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ton indentation "erratique" rend assez difficile la lecture de ton code !
    Premièrement, l'exception que tu as s'obtient quand on démarre 2 fois le même thread. Un thread ne peut être démarré qu'une fois (et peu importe qu'il soit fini ou pas).

    Il y a d'autres problèmes qui rend ton programme assez incohérent :
    Il y'a cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread thread = new Thread(tache);
    L'instance de thread qui est démarré par la méthode start() est dans l'attribut thread de la classe. Or, dans la ligne ci-dessus, tu crées une nouvelle instance de thread que tu stockes dans une variable locale : l'instance dans l'attribut n'est donc pas remplacée.
    Alors que dans ta méthode stop(), tu crées une nouvelle instance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void stop(ACLMessage msg){
             this.msg=msg;
            thread = new Thread(tache);
     
        thread.interrupt();
      }
    L'instance de thread référencé par la variable thread avant nouvelle affectation ne sera donc jamais "interrompue". Quant au nouveau thread, aucun intérêt de l'interrompre, ça ne fait que passer son état interrupted à true. Parce que c'est tout ce que ça fait interrupt() (certaines méthodes soulèveront une exception dans ce cas (des méthodes bloquantes comme sleep() ou wait()), mais c'est tout).

    Pour arrêter un thread qui est en boucle, il te faudra juste gérer un booléen : boucler tant que le booléen est true, et la méthode stop le passe à false. interrupt te permettra d'écourter une partie bloquante dans la boucle. Pour le rédémarrer, il te faudra absolument créé une nouvelle instance. Pour éviter de démarrer un thread déjà démarré il te faudra stocker d'une manière ou d'une autre un état qui te permet de savoir qu'un thread est déjà démarré.

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 131
    Points : 93
    Points
    93
    Par défaut
    Ah oui j'ai pas fait attention au moment des modifications , et Merci infiniment pour l'aide Mr Joel ,avec les informations précieuses que vous venez de les poster, j'ai arrivé maintenant à arrêter le traitement du thread par l'ajout d'une condition.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSD] Mapper intelligemment un XSD avec des Objets Java
    Par PoteA_Tooz dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 09/05/2008, 11h33
  2. [POO] Listing avec des objets
    Par estampille dans le forum Langage
    Réponses: 5
    Dernier message: 27/08/2007, 17h19
  3. Réponses: 1
    Dernier message: 05/06/2007, 18h14
  4. [C#]Travailler en synchrone avec des objets asynchrone
    Par mister3957 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/10/2006, 19h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo