Prod-Cons の問題に対する単純な Blocking Queue の例を書きました。以下の例は機能しません。エンキュー/デキューロジックの追加/削除部分を待機中のスレッドの通知と交換しない限り。BlockingQueue のどの実装でも、この動作の明確な説明を見つけることができませんでした。エンキューの部分は、要素を追加してから通知するのが正しいのではないでしょうか? このようにして、コンシューマー スレッドが実行されるときに、コンシューマーへの要素があり、null を返さないことを保証できます。説明してください。
import java.util.LinkedList;
import java.util.Queue;
public class BlockingQueueCustom<T> {
private int size = 10;
private Queue<T> queue = new LinkedList<T>();
public BlockingQueueCustom(int s) {
this.size = s;
}
public synchronized void enqueue(T element) throws InterruptedException {
while (queue.size() == size) {
wait();
}
queue.add(element); //Comment this part to make it work
if (queue.size() == 0) {
this.notifyAll();
}
//queue.add(element); Uncommenting this will make it work
}
public synchronized T dequeue() throws InterruptedException {
while (queue.size() == 0) {
this.wait();
}
T element = queue.remove(); //Comment this part to make it work
if (queue.size() == size) {
this.notifyAll();
}
return element; //Comment this part to make it work
//return queue.remove(); Uncommenting this will make it work
}
}