Bonjour à tous,
j'utilise entre 2 Thread un objet BlockingQueue pour échanger une commande.
le Thread 1 est en attente de nouvelle commande sur la queue:
tandis que le Thread 2 envoit une commande sur cette queue
Code : Sélectionner tout - Visualiser dans une fenêtre à part queue.take();
cela tourne bien, mais si le Thread 2 envoit deux commandes sur la queue dans la même méthode avec un délai entre les deux, la première n'est pas prise en compte dès reception sur la queue, ce n'est que lorsque la deuxième est envoyée et que l'on sort de la méthode du Thread 2 que l'on va traiter les 2 commandes dans le Thread 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part queue.offer(command);
voici le code du Thread 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ManagerDev obj = ManagerDev.getInstance(); synchronized(cmd){ //premiere commande obj.sendCommand(cmd); } //Entre les deux on peut mettre un delai... try{ Thread.sleep(10000); }catch(Exception e){ } //deuxieme commande obj.sendCommand(cmd);
et voici le code du Thread1:
donc dans ce cas mon Thread2 bloque sur getCommand (normal) jusqu'à recevoir une commande dans la queue, mais si un Thread 1 écrit deux commandes dans la queue, on doit attendre la fin de la méthode du Thread1 pour traiter les commandes dans le Thread2.
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 public void sendCommand(Command command){ synchronized(queue){ queue.offer(command); queue.notify(); } } protected Command getCommand() { try { return this.queue.take(); } catch (InterruptedException e) { log.debug("Erreur de GetCommand"); throw new RuntimeException(e); } } public void run(){ ... cmd = getCommand(); ... }
n'y a t'il pas un moyen de laisser le Thread2 (et donc queue.offer()) de débloquer mon thread2 en attendant la réception de la deuxième commande ?
j'ai tenté (comme décrit dans le code) d'utiliser les notify mais rien ne fait...
Merci de votre aide !
Tiamat.
Partager