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:
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 lentê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:
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