Méthode notify() de Java Object
Classe Object de Java
La méthode notify() de la classe Object est utilisée pour réveiller un fil d'exécution en attente sur le moniteur de cet objet.
Si tous les threads sont en attente sur cet objet, un seul thread sera sélectionné. La sélection est arbitraire et se produit lorsque l'implémentation prend une décision.
Un thread peut appeler la méthode wait() pour attendre sur le moniteur d'un objet.
La méthode notify() ne peut être appelée que par un thread qui est le propriétaire du moniteur de cet objet.
Pour qu'un thread devienne le propriétaire du moniteur d'un objet, il peut utiliser les 3 méthodes suivantes :
- Exécution d'une méthode d'instance synchronisée de l'objet
- Utilisation du verrou intégré synchronized
- Pour les objets de type Class, exécution d'une méthode statique synchronisée
Un seul thread peut posséder le moniteur d'un objet à la fois.
Si le thread actuel n'est pas le propriétaire du moniteur de cet objet, il lèveraIllegalMonitorStateExceptionune exception.
Syntaxe
public final void notify()
Parameters
Valeur de retour
Aucune valeur de retour.
Exemple
L'exemple suivant montre l'utilisation de la méthode notify() :
Exemple
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class ExampleTest {
private List synchedList;
public ExampleTest() {
synchedList = Collections.synchronizedList(new LinkedList());
}
public String removeElement() throws InterruptedException {
synchronized (synchedList) {
while (synchedList.isEmpty()) {
System.out.println("La liste est vide...");
synchedList.wait();
System.out.println("En attente...");
}
String element = (String) synchedList.remove(0);
return element;
}
}
public void addElement(String element) {
System.out.println("Ouverture...");
synchronized (synchedList) {
synchedList.add(element);
System.out.println("Nouvel élément:'" + element + "'");
synchedList.notifyAll();
System.out.println("notifyAll appelé!");
}
System.out.println("Fermeture...");
}
public static void main(String[] args) {
final ExampleTest demo = new ExampleTest();
Runnable runA = new Runnable() {
public void run() {
try {
String item = demo.removeElement();
System.out.println("" + item);
} catch (InterruptedException ix) {
System.out.println("Exception interrompue !");
} catch (Exception x) {
System.out.println("Exception levée.");
}
}
};
Runnable runB = new Runnable() {
public void run() {
demo.addElement("Bonjour !");
}
};
try {
Thread threadA1 = new Thread(runA, "Google");
threadA1.start();
Thread.sleep(500);
Thread threadA2 = new Thread(runA, "Exemple");
threadA2.start();
Thread.sleep(500);
Thread threadB = new Thread(runB, "Taobao");
threadB.start();
Thread.sleep(1000);
threadA1.interrupt();
threadA2.interrupt();
} catch (InterruptedException x) {
}
}
}
La sortie du programme ci-dessus est :
List is empty...
List is empty...
Opening...
New Element:'Hello!'
notifyAll called!
Closing...
Waiting...
Waiting...
List is empty...
Hello!
Interrupted Exception!
Classe Object de Java
Autres extensions