« Programmation Java/Processus légers et synchronisation » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 134 :
 
===Attente et signal===
Quand le mot-clé <code>synchronized</code> ne suffit pas (par exemple, permettre l'accès à deux threads simultanément au lieu d'un seul), il est possible de suspendre un thread et le réveiller.
 
La classe <code>Object</code> possède les méthodes suivantes :
* <code>wait()</code> suspend le thread courant jusqu'à ce que la méthode <code>notify()</code> ou <code>notifyAll()</code> de cet objet soit appelée;
* <code>wait(long timeout)</code> suspend le thread courant jusqu'à ce que la méthode <code>notify()</code> ou <code>notifyAll()</code> de cet objet soit appelée, ou bien que le temps indiqué soit écoulé;
* <code>notify()</code> réveille l'un des threads en attente de cet objet,
* <code>notifyAll()</code> réveille tous les threads en attente de cet objet.
 
Pour appeler l'une de ces quatre méthodes, il faut ''posséder'' l'objet.
Ce qui signifie utiliser l'instruction <code>synchronized</code>.
Dans le cas contraire, l'exception suivante est levée :
java.lang.IllegalMonitorStateException: current thread not owner
 
Exemple :
synchronized(myobj)
{
myobj.wait();
}