Java での Wait() と Notify() の使用: キューを使用したシナリオ
質問:
wait() とQueue を使用した Notice() メソッド?
回答:
Wait() と Notify() の原則
Wait () と Notice() は、スレッドが特定の条件が満たされるまで待機してから続行することにより、スレッドの調整を可能にします。この場合、容量制限を強制するブロッキング キューの作成に興味があります。
実装
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(); // Notify waiting threads } public synchronized T take() throws InterruptedException { while (queue.isEmpty()) { wait(); } T item = queue.remove(); notify(); // Notify waiting threads return item; } }
仕組み
注: wait() と Notice() の呼び出しは同じオブジェクト上で同期され、誤ったウェイクアップを処理するために while ループ内に配置されます。
Java 1.5 同時機能
Java 1.5 では java.util.concurrent パッケージが導入され、スレッド調整のための高レベルの抽象化が提供されました。この例の更新バージョンは次のとおりです。
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; 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(); } } }
このアプローチでは、ロックと条件を使用してスレッド調整を改善します。
BlockingQueue インターフェイスを検討してください
ブロッキング キューが必要な場合は、スレッド セーフで標準的な実装を提供する Java BlockingQueue インターフェイスの実装の使用を検討してください。容量制御の操作。
以上がJava の `wait()` メソッドと `notify()` メソッドを使用してブロッキング キューを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。