Le 14 Mar 2002 Guillaume Desnoix a �crit :

> Jean-Philippe Encausse wrote:
>  > synchronize(this) {
>  > try { wait(100); }
>  > catch(InterruptedException e){ e.printStackTrace(); }
>  > }
> 
> C'est l'idee mais en synchronisant sur this, tu le bloques. Il faut
> mieux utiliser un autre objet dedie specifiquement au role de verrou.
> 

Oui et non. Oui tu le bloques avec le synchronize, mais tu le 
d�bloques pendant le wait. De toutes fa�ons tu as raison, il vaut 
mieux utiliser un objet d�di� au r�le de verrou. A mon avis l'id�al 
est une simple variable locale, comme dans ton exemple :

> Object o=new Object();
> try
> {
>     synchronized(o) { o.wait(45000); }
> }
> catch(InterruptedException ex) { }
> 
> (encore mieux, utiliser un recyclage du verrou).
> 
> Enfin il faut mettre le tout dans une boucle si on veut garantir a
> 100% l'attente (au cas ou interrupt() est appele).
> 
> Sinon j'utilise le plus souvent Thread.sleep() mais j'ai lu, je ne
> sais plus ou, que wait() etait preferable (car les verrous sont
> liberes durant l'attente). Qqn peut confirmer ?
> 

Oui, je confirme. Le sleep ne passe pas forc�ment la main � un autre 
thread, et ne lib�re aucun verrou. Heureusement, d'ailleurs, puisque 
tu n'as pas besoin de verrou pour faire un sleep. Remarquez aussi que 
rien n'emp�che un sleep de passer la main � un autre thread, il ne le 
fait pas forc�ment, c'est tout.


--
Sur le Web, tout de suite.
Herve AGNOUX - diaam informatique
http://www.diaam-informatique.com

Répondre à