Maison >Java >javaDidacticiel >Comment `wait()` et `notify()` peuvent-ils être utilisés pour implémenter une file d'attente de blocage en Java ?
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.
Conditions de blocage :
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; } }
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(); } } }
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!