在这里考虑2个生产者线程和1个消费者线程。
假设队列已满。
由于队列已满,两个生产者线程进入等待状态。
消费者线程从队列和notifyAll中获取元素,因此生产者线程中的一个添加元素并退出,另一个生产者线程保持等待状态,另一个生产者线程再次添加元素并退出。
因此,如果您观察到,则有一个线程可能始终处于等待状态的机会。
如何避免这种情况?
import java.util.LinkedList;
import java.util.List;
interface BlockingQueueCustom<E> {
void put(E item) throws InterruptedException ;
E take() throws InterruptedException;
}
class LinkedBlockingQueueCustom<E> implements BlockingQueueCustom<E> {
private List<E> queue;
private int maxSize; // maximum number of elements queue can hold at a time.
public LinkedBlockingQueueCustom(int maxSize) {
this.maxSize = maxSize;
queue = new LinkedList<E>();
}
public synchronized void put(E item) throws InterruptedException {
while(queue.size() == maxSize) {
this.wait();
}
queue.add(item);
this.notifyAll();
}
public synchronized E take() throws InterruptedException {
while(queue.size() == 0) {
this.wait();
}
this.notifyAll();
return queue.remove(0);
}
}
public class BlockingQueueCustomTest {
public static void main(String[] args) throws InterruptedException {
BlockingQueueCustom<Integer> b = new LinkedBlockingQueueCustom<Integer>(10);
System.out.println("put(11)");
b.put(11);
System.out.println("put(12)");
b.put(12);
System.out.println("take() > " + b.take());
System.out.println("take() > " + b.take());
}
}
蝴蝶不菲
相关分类