Méthode notify() de Java Object

Java String类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

  • Aucune 。

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() { //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 est présent 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!

Java String类Classe Object de Java

Autres extensions