Maison Java javaDidacticiel Comment utiliser correctement les méthodes objet attendre et notifier en Java

Comment utiliser correctement les méthodes objet attendre et notifier en Java

Dec 20, 2023 pm 01:30 PM
- méthodes d'objet Java - méthode d'attente - méthode de notification

Comment utiliser correctement les méthodes objet attendre et notifier en Java

Comment utiliser correctement les méthodes objet en Java : attendre et notifier

En Java, attendre et notifier sont des méthodes importantes utilisées pour réaliser une collaboration entre multi-threads. L'utilisation correcte de ces deux méthodes peut éviter les problèmes multithread tels que les conditions de concurrence et les blocages, et garantir la sécurité et l'efficacité du programme. Cet article explique comment utiliser correctement les méthodes objet wait et notify en Java et fournit des exemples de code spécifiques.

1. Les principes et fonctions de base d'attendre et de notifier

Avant de comprendre comment utiliser correctement attendre et notifier, vous devez comprendre leurs principes et fonctions de base.

  1. wait : mettez le thread actuel dans un état d'attente jusqu'à ce que d'autres threads le réveillent via la méthode notify ou notifyAll. L'utilisation de la méthode wait peut effectivement libérer le verrou de l'objet et bloquer le thread actuel, ce qui l'oblige à suspendre son exécution.
  2. notifier : Réveille un fil en attente sur l'objet. S'il y a plusieurs threads en attente, notify ne réveillera qu'un seul thread de manière aléatoire et le thread spécifique à réveiller est incertain.
  3. notifyAll : Réveillez tous les threads en attente sur cet objet. Utilisez la méthode notifyAll pour réveiller tous les threads en attente, mais le thread à réveiller dépend du planificateur de threads.

2. Étapes pour utiliser correctement wait and notify

Pour utiliser wait and notify correctement, vous devez suivre les étapes suivantes :

  1. Verrouillage : lors de l'utilisation de wait and notify, vous devez d'abord obtenir le verrouillage de l'objet. Vous pouvez utiliser le mot-clé synchronisé pour verrouiller ou utiliser l'objet Lock pour verrouiller.
  2. Appelez la méthode wait : avant d'entrer dans la section critique, appelez la méthode wait de l'objet lock pour mettre le thread actuel dans un état d'attente.
  3. Jugement conditionnel : Avant d'entrer dans la section critique, les conditions des ressources partagées doivent d'abord être vérifiées. Si la condition n’est pas remplie, vous devez continuer à attendre jusqu’à ce qu’elle soit remplie.
  4. Relâcher le verrou : après avoir appelé la méthode d'attente, le thread actuel libérera le verrou de l'objet, permettant à d'autres threads d'entrer dans la section critique pour exploiter les ressources partagées.
  5. Appelez la méthode notify ou notifyAll : lorsque les conditions sont remplies, vous pouvez appeler la méthode notify ou notifyAll de l'objet de verrouillage pour réveiller le thread en attente.
  6. Relock : Le fil éveillé retrouvera le verrouillage de l'objet et continuera à concourir pour l'exécution.

3. Exemples de code spécifiques

Les exemples de code suivants montrent comment utiliser correctement wait et notify pour réaliser une collaboration entre deux threads. Un thread est chargé d'attendre d'être réveillé et l'autre thread est responsable du réveil.

public class WaitNotifyExample {
    private static final Object lock = new Object();
    private static boolean isReady = false;

    public static void main(String[] args) {
        Thread waitingThread = new Thread(() -> {
            synchronized (lock) {
                while (!isReady) {
                    try {
                        System.out.println("等待中...");
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("等待结束!");
            }
        });

        Thread notifyingThread = new Thread(() -> {
            synchronized (lock) {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("唤醒等待的线程...");
                isReady = true;
                lock.notify();
            }
        });

        waitingThread.start();
        notifyingThread.start();
    }
}
Copier après la connexion

Exécutez le code ci-dessus, vous pouvez voir que le thread en attente entrera dans l'état d'attente et poursuivra son exécution après avoir été réveillé.

Dans cet exemple, nous utilisons une variable booléenne partagée isReady pour représenter la condition d'attente. Le thread en attente vérifiera isReady avant d'entrer dans la section critique. Si la condition n'est pas remplie, la méthode wait sera appelée pour entrer dans l'état d'attente. Une fois que le thread de réveil remplit la condition, il modifiera la valeur de isReady et appellera la méthode notify pour réveiller le thread en attente.

Il convient de noter que lors de l'utilisation de wait et notify, vous devez vous assurer que le thread acquiert le verrou du même objet. Sinon, le thread ne peut pas entrer correctement dans l'état d'attente ou être réveillé.

Résumé

L'utilisation des méthodes wait et notify peut réaliser une collaboration entre plusieurs threads et garantir la sécurité et l'efficacité du programme. Lorsque vous utilisez ces deux méthodes, vous devez suivre les étapes correctes, notamment le verrouillage, l'appel de la méthode wait, la vérification des conditions, la libération du verrou, l'appel de la méthode notify, etc. En utilisant rationnellement les méthodes d'attente et de notification, nous pouvons éviter les problèmes de multithread et améliorer la fiabilité et la maintenabilité du programme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Top 4 frameworks JavaScript en 2025: React, Angular, Vue, Svelte Top 4 frameworks JavaScript en 2025: React, Angular, Vue, Svelte Mar 07, 2025 pm 06:09 PM

Top 4 frameworks JavaScript en 2025: React, Angular, Vue, Svelte

Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation? Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation? Mar 17, 2025 pm 05:35 PM

Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation?

Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux? Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux? Mar 17, 2025 pm 05:43 PM

Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux?

Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Mar 17, 2025 pm 05:46 PM

Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance?

Node.js 20: Boosts de performances clés et nouvelles fonctionnalités Node.js 20: Boosts de performances clés et nouvelles fonctionnalités Mar 07, 2025 pm 06:12 PM

Node.js 20: Boosts de performances clés et nouvelles fonctionnalités

Iceberg: L'avenir des tables de Data Lake Iceberg: L'avenir des tables de Data Lake Mar 07, 2025 pm 06:31 PM

Iceberg: L'avenir des tables de Data Lake

Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave? Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave? Mar 17, 2025 pm 05:44 PM

Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave?

Spring Boot SnakeyAml 2.0 CVE-2022-1471 Issue fixe Spring Boot SnakeyAml 2.0 CVE-2022-1471 Issue fixe Mar 07, 2025 pm 05:52 PM

Spring Boot SnakeyAml 2.0 CVE-2022-1471 Issue fixe

See all articles