Bonjour, j'ai un petit problème avec un programme que j'essaye de terminer pour ce soir. Voilà le souci : j'ai un Thread qui possède en attribut un objet de type message. Ce message est initialisé à null.
Le processus se met en wait() tant que le message est à null. Dès qu'il est différent de null, on l'envoit par un ObjectOutputStream. Ensuite, on remet le message à null pour ne pas l'envoyer plusieurs fois de suite.
Le seul moyen pour changer l'état du message, c'est qu'un autre processus appelle la méthode messageOut(Message m) qui change la valeur de l'attribut de la classe.
Voici le code de la classe :
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
47
48
49
50
51 public class Diffuseur implements Runnable, DiffuseurInterface { private Socket sd; private ObjectOutputStream out; private Message msg; public Diffuseur(Socket sd){ this.sd = sd; try{ out = new ObjectOutputStream(sd.getOutputStream()); } catch(Exception e){e.printStackTrace();}; DiffuseurManager.lesDiffuseurs.add(this); msg = null; new Thread(this).start(); } @Override public synchronized void run() { try{ out.writeObject(new Message(afficherAide(),"Message du serveur","",false));} catch(Exception e){e.printStackTrace();} while(true){ try{ while(msg == null) this.wait(); out.writeObject(msg); msg = null; } catch(Exception e){ e.printStackTrace(); try{ sd.close(); } catch(IOException c){ e.printStackTrace(); } break; } } } public static String afficherAide(){ String s = "blabla"; return s; } public synchronized void messageOut(Message msg){ try{ while(this.msg != null) this.wait(); } catch(InterruptedException e){e.printStackTrace();} this.msg = msg; } }
Je pense que c'est un problème de synchronisation. Quand j'affiche le message dans la méthode de réception (par un System.out.println(this.msg)) ,j'ai le bon message qui s'affiche... Je sais pas comment résoudre ce problème donc je me tourne vers vous.
J'ai essayé avec des this.notifyAll() à la fin de la méthode d'acquisition du message ainsi qu'après l'envoi du message par l'ObjectOutputStream, mais rien n'y fait... Il y a un deadlock (selon ce que je pense) que je n'arrive pas à dénouer
Merci d'avance,
Partager