Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1056 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1807685
Siron
Posté le 03-11-2008 à 14:02:24  profilanswer
 

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
mood
Publicité
Posté le 03-11-2008 à 14:02:24  profilanswer
 

n°1807687
Siron
Posté le 03-11-2008 à 14:06:44  profilanswer
 

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 ?

n°1807702
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2008 à 14:31:44  profilanswer
 

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
n°1807710
Siron
Posté le 03-11-2008 à 14:43:06  profilanswer
 

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.

n°1807721
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2008 à 14:57:24  profilanswer
 

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
n°1807730
Siron
Posté le 03-11-2008 à 15:14:13  profilanswer
 

Ç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.

n°1807731
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2008 à 15:15:19  profilanswer
 

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
n°1807732
Siron
Posté le 03-11-2008 à 15:20:34  profilanswer
 

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() ?
 

n°1808317
Siron
Posté le 04-11-2008 à 19:32:33  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[NHibernate] Question sur le type des propriétés/colonnesQuestion bête. Mais je n'ai pas trouvé
Question classe sessionQuestion général checkboxlist
Question sur le positionnement CSS[Résolu]Petite question trés simple pour comparaison entre deux chaine
Question noob déploiement site asp.netsimple question de type de variable
Question pour un champion !Petit question sur le résultat d'une heure dans un script
Plus de sujets relatifs à : Question sur sleep() et wait(), pourquoi le synchronized ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR