Maison > Java > javaDidacticiel > Comment `wait()` et `notify()` peuvent-ils être utilisés pour implémenter une file d'attente de blocage en Java ?

Comment `wait()` et `notify()` peuvent-ils être utilisés pour implémenter une file d'attente de blocage en Java ?

Patricia Arquette
Libérer: 2024-12-29 06:12:16
original
874 Les gens l'ont consulté

How Can `wait()` and `notify()` Be Used to Implement a Blocking Queue in Java?

Utiliser wait() et notify() pour implémenter une file d'attente de blocage

Introduction

Dans la programmation multithread, wait() et notify() sont utilisé pour la synchronisation des threads. Cet article explique comment utiliser wait() et notify() pour implémenter une file d'attente de blocage, une structure de données qui permet aux threads de se bloquer jusqu'à ce qu'un élément soit disponible ou que de l'espace devienne disponible.

Implémentation d'une file d'attente de blocage avec wait( ) et notify()

Conditions de blocage :

  • put() méthode : Bloque jusqu'à ce qu'il y ait de l'espace libre dans la file d'attente.
  • Méthode take() : Bloque jusqu'à ce qu'il y ait un élément disponible dans la file d'attente.

Code Java :

public class BlockingQueue<T> {

    private Queue<T> queue = new LinkedList<>();
    private int capacity;

    public BlockingQueue(int capacity) {
        this.capacity = capacity;
    }

    public synchronized void put(T element) throws InterruptedException {
        while (queue.size() == capacity) {
            wait();
        }

        queue.add(element);
        notify(); // notifyAll() for multiple producer/consumer threads
    }

    public synchronized T take() throws InterruptedException {
        while (queue.isEmpty()) {
            wait();
        }

        T item = queue.remove();
        notify(); // notifyAll() for multiple producer/consumer threads
        return item;
    }
}
Copier après la connexion

Considérations lors de l'utilisation de wait() et notify()

  • Code synchronisé : Appelez wait() et notify() dans une méthode ou un bloc synchronisé.
  • Boucles While : Utilisez les boucles while au lieu des instructions if pour vérifier les conditions dues à des erreurs réveils.

Bibliothèque de concurrence Java 1.5

Java 1.5 a introduit une bibliothèque de concurrence qui fournit des abstractions de niveau supérieur :

Implémentation de file d'attente de blocage modifiée :

public class BlockingQueue<T> {

    private Queue<T> queue = new LinkedList<>();
    private int capacity;
    private Lock lock = new ReentrantLock();
    private Condition notFull = lock.newCondition();
    private Condition notEmpty = lock.newCondition();

    public BlockingQueue(int capacity) {
        this.capacity = capacity;
    }

    public void put(T element) throws InterruptedException {
        lock.lock();
        try {
            while (queue.size() == capacity) {
                notFull.await();
            }

            queue.add(element);
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    public T take() throws InterruptedException {
        lock.lock();
        try {
            while (queue.isEmpty()) {
                notEmpty.await();
            }

            T item = queue.remove();
            notFull.signal();
            return item;
        } finally {
            lock.unlock();
        }
    }
}
Copier après la connexion

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal