Java の wait() と Notice(): キューを使用した簡単なシナリオ
Java では、wait() と Notify()メソッドは、スレッド同期のメカニズムを提供します。これらのメソッドを使用してブロッキング キューを実装できる簡単なシナリオを見てみましょう。
ブロッキング キューの実装
ブロッキング キューは、スレッドをブロックするキュー データ構造です。特定の条件が満たされない場合に特定の操作を実行しようとすること。私たちの実装では、put() メソッドと take() メソッドを実装します。これらは、キューが満杯または空の場合にそれぞれブロックします。
public class BlockingQueue<T> { private Queue<T> queue = new LinkedList<>(); private int capacity; public BlockingQueue(int capacity) { this.capacity = capacity; } // Blocks if the queue is full (no space to insert) public synchronized void put(T element) throws InterruptedException { while (queue.size() == capacity) { wait(); } queue.add(element); notifyAll(); } // Blocks if the queue is empty (nothing to remove) public synchronized T take() throws InterruptedException { while (queue.isEmpty()) { wait(); } T item = queue.remove(); notifyAll(); return item; } }
Usage
それでは、このブロッキング キューの使用方法を見てみましょう。
BlockingQueue<Integer> queue = new BlockingQueue<>(10); // Producer thread: adds elements to the queue new Thread(() -> { for (int i = 0; i < 15; i++) { try { queue.put(i); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); // Consumer thread: retrieves elements from the queue new Thread(() -> { for (int i = 0; i < 15; i++) { try { System.out.println(queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } } }).start();
この例では、プロデューサー スレッドは要素をキューが容量制限に達するとブロックされます。コンシューマ スレッドは要素を取得し、キューが空になるとブロックします。
重要な考慮事項
以上がJava の `wait()` メソッドと `notify()` メソッドはブロッキング キューをどのように実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。