Méthode notifyAll() de la classe Object en Java
La méthode notifyAll() de Object est utilisée pour réveiller tous les threads en attente sur cet objet.
La méthode notifyAll() est similaire à la méthodenotify(),La différence est que la méthode notifyAll() réveille tous les threads en attente sur le moniteur de cet objet, tandis que la méthode notify() réveille un thread.
Si le thread courant n'est pas le propriétaire du moniteur de l'objet, l'appel de la méthode notifyAll() lèvera également une exceptionIllegalMonitorStateException.
Syntaxe
public final void notifyAll()
Parameters
Aucune 。
Valeur de retour
Aucune valeur de retour.
Exemple
L'exemple suivant montre l'utilisation de la méthode notifyAll() :
Exemple
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class ExampleTest {
private List synchedList;
public ExampleTest() {
//Créer une liste synchronisée
synchedList = Collections.synchronizedList(new LinkedList());
}
//Supprimer un élément de la liste
public String removeElement() throws InterruptedException {
synchronized (synchedList) {
//Attendre si la liste est vide
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;
}
}
//Ajouter un élément à la liste
public void addElement(String element) {
System.out.println("Ouverture...");
synchronized (synchedList) {
//Ajouter un élément et notifier que l'élément existe
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() {
//Effectuez l'opération d'ajout d'élément et démarrez la boucle
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!
Autres extensions
Classe Object de Java