Synchronisation entre threads en java

mersai Messages postés 10 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 22 avril 2009 - 28 mars 2009 à 13:41
mersai Messages postés 10 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 22 avril 2009 - 1 avril 2009 à 15:57
je viens de commencé avec les threads en java. et mon problème est comment synchroniser deux threads qui s'attendent mutuellement sur la réception d'un message.

je m'explique, chacun de ces deux threads est en attente pendent un temps donné, a l'expiration de ce temps il envoi un message au deuxième, mais il peut recevoir un message avant l'expiration du temps d'attente (si le temps du deuxième expire avant lui) dans ce cas il va se mettre a l'état sommeil.

je sais que lidée est d'utiliser wait() et notifyAll() mais comment?

merci pour votre aide

7 réponses

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 mars 2009 à 15:16
salut

pour attendre :

synchronized(obj){
obj.wait();
}

attention, faut catcher un interruptedException


pour notifier :

synchronized(obj){
obj.notify();
}
0
mersai Messages postés 10 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 22 avril 2009
28 mars 2009 à 15:26
bjr,

où je déclare :
synchronized(obj){
obj.wait();
}
et
synchronized(obj){
obj.notify();
}

dans la méthode run() de la classe Threads.

une autre question obj est un message mais comment je fait référence a lui et où dois-je le déclarer.

merci
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 mars 2009 à 16:20
Object obj = new Object();
0
mersai Messages postés 10 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 22 avril 2009
28 mars 2009 à 20:24
bsoir,

pas tout a fait claire?

où je vé instanciée object?

et

synchronized(obj){
obj.wait();
}
et
synchronized(obj){
obj.notify();
}

où je les déclare ?

l'appel a ces méthodes dan la fonction run?

si vous pouvez bien m'expliquai car je n'ai pas bien compris.

merci
0

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

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 mars 2009 à 20:29
... tu devrais lire un cours et faire des tests, c'est pas a moi de t'expliquer tout ca...

quand t'as deux threads, si A doit attendre un evenement et que B lance cet evenement, alors :

AVANT tout ca, tu initialise obj = new Object();

quand A doit attendre, tu fais :
synchronized(obj){
obj.wait();
}

et quand B doit reveiller A, tu fais :
synchronized(obj){
obj.notify();
}

et a part Object obj, ce ne sont pas des declarations. java n'est pas un langage declaratif.
0
mersai Messages postés 10 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 22 avril 2009
31 mars 2009 à 13:25
bonjour,

voila j'ai essayé la solution que vous m'avez donné et je n'arrive pas a avoir le résultat.

de maniéré précise, je veux mettre en ouevre la situation suivante en utilisant les mécanisme de synchronisation (notiffyAll() et wait() ) des threads sous java:

j'ai 4 threads que je lance depuis une fonction main(), chacun se met en attente d'un message, de la part des autres, pendant un temps quelconque. si le temps d'attente expire et le thread n'a pas reçu de message il envoi un message aux autres, par contre s'il reçoit un message de l'un des trois autres threads il va se mettre a l'état sleep.

notez que le thread qui envoi le message affiche un message "je suis actif"
ceux qui se mettent a sleep() après avoir reçu un message affichent "inactif"

j'ai essayé en faisant la synchronisation sur un message de type Objet dans la méthode run ():

msg = new OBjet ();

et les deux méthode

synchronized(msg){
msg.wait(temps attente)
}
un thread qui appel cette méthode ne quitte pas l'attente jusqu'à ce qu'il reçoit notifyAll des autres, je veut qu'il quitte dés que te temps d'attente est finie? comment le faire?

synchronized(msg){
msg.notiffyAll()
}

mais j'ai du mal a avoir des résultats, j'ai essayé et essayé sans aboutir a rien

je sais que vous pouvez m'aidai, merci d'avance.
0
mersai Messages postés 10 Date d'inscription lundi 26 avril 2004 Statut Membre Dernière intervention 22 avril 2009
1 avril 2009 à 15:57
merci tout le monde, jé trouvé la soulution
0
Rejoignez-nous