Question sur sleep() et wait(), pourquoi le synchronized ?

Question sur sleep() et wait(), pourquoi le synchronized ? - Java - Programmation

Marsh Posté le 03-11-2008 à 14:02:24    

Bonjour, je cherche comment mettre en pause un thread indéfiniment jusqu'à ce que un autre thread le réveille.
Voici ou j'en suis dans mes investigations :
 
Avec sleep() :
- La méthode sleep() ne permet pas de faire une pause infinie.
- Toutefois je peux utiliser sleep() avec un nombre vraiment très grand, et pour réveiller le thread je fais un interrupt() dessus, cela est-il propre ?
 
Avec wait() :  
- Le wait() ne fonctionne que dans un synchronized, or malgré la présence autour du wait d'un synchronized(object x), j'ai une IllegalMonitorStateException, pour la contrer j'ai donc mis dans l'en tête de la méthode run(), un synchronized, et la ça fonctionne.  
- Pour réveiller d'un wait(), j'utilise aussi la méthode interrupt(), car je n'ai pas envie de mettre mes threads appelant le notify() en synchronized.
 
D'où ma seconde question, pourquoi le thread appelant wait() ou notify() doit-il lui-même être en synchronized ?
Ce synchronized sur le thread ne change rien sur les autres méthodes du thread ? (je suppose que non vu qu'une méthode appliquée sur un thread s'exécute en fait dans le thread appelant).
 
Merci pour vos réponses.
 
Siron


Message édité par Siron le 03-11-2008 à 14:03:04
Reply

Marsh Posté le 03-11-2008 à 14:02:24   

Reply

Marsh Posté le 03-11-2008 à 14:06:44    

En écrivant le message, j'ai eu un vent de réponse dans ma petite tête :
 
On demande le synchronized avec le wait() et le notify() pour éviter, si d'autre thread sont sur le coup, de bloquer ces autres thread ?
 
Si ma réponse est bonne, reste la question du interrupt() pour réveiller d'un sleep, est ce que c'est propre comme mode de fonctionnemnt ?

Reply

Marsh Posté le 03-11-2008 à 14:31:44    

Le réveil, il est fait pourquoi/dans quelles circonstances?
 
Et tu utilises quelle version de java?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 03-11-2008 à 14:43:06    

J'utilise java 1.6.
 
En fait je dois créer un dispatcher pour un système distribué avec des travailleurs et des travaux.
J'ai une boucle dans le dispatcher qui donne le prochain travail de disponible au premier travailleur dans la liste d'attente.
Si la liste d'attente des travailleurs est vide ou que la liste des travaux à effectuer est vide, je préfère mettre le thread en wait plutôt que de faire boucler le tout dans le vide.
Donc le thread du dispatcher doit être réveillé dès qu'un travail ou un travailleur s'enregistre dans les files d'attentes.
 
Mes synchronized de base vont donc sur la liste des travailleurs et travaux disponibles.

Reply

Marsh Posté le 03-11-2008 à 14:57:24    

Siron a écrit :

J'utilise java 1.6.

 

En fait je dois créer un dispatcher pour un système distribué avec des travailleurs et des travaux.
J'ai une boucle dans le dispatcher qui donne le prochain travail de disponible au premier travailleur dans la liste d'attente.
Si la liste d'attente des travailleurs est vide ou que la liste des travaux à effectuer est vide, je préfère mettre le thread en wait plutôt que de faire boucler le tout dans le vide.
Donc le thread du dispatcher doit être réveillé dès qu'un travail ou un travailleur s'enregistre dans les files d'attentes.

 

Mes synchronized de base vont donc sur la liste des travailleurs et travaux disponibles.


 [:prozac]  [:prozac]  [:prozac]  [:prozac]  [:prozac]

 

Je vais te suggérer d'aller jeter un oeil sur java.util.concurrent là [:dawa]


Message édité par masklinn le 03-11-2008 à 14:57:31

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 03-11-2008 à 15:14:13    

Ça à l'air très chouette ton truc, mais ce sera pas pour cette fois si  :) .
 
 
En fait le dispatcher est déjà fini, il ne me reste qu'a finir les testes en réseau avec les autres composants et corba.

Reply

Marsh Posté le 03-11-2008 à 15:15:19    

Ben désolé de te dire que si tu veux réinventer java.util.concurrent en version qui fonctionne moins bien ça sera sans moi, bon courage pour la suite :jap:


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 03-11-2008 à 15:20:34    

Le projet est un travail de cours, même si on fait comme on veut, je crois que c'est mieux pour l'apprentissage de ne pas trop utiliser de classe de haut niveau (et puis je vais pas recommencer mon dispatcher).
 
Sinon quelqu'un pourrait me confirmer ma réponse sur la synchronized du wait() et notify() ?
 

Reply

Marsh Posté le 04-11-2008 à 19:32:33    

Si je fais un :

 

synchronized(toto){

 

   synchronized(this){wait(0);}

 

}

 

Le verrou sur l'objet toto va être relâché ?  Et quand un notify() sera effectué sur le thread endormi, il devra attendre de pouvoir récupérer le verrou sur toto pour se relancer ?


Message édité par Siron le 04-11-2008 à 19:32:42
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed