package com.example.interview.multi_thread;
import java.util.ArrayDeque;
interface BlockingQueue1<E> {
void put(E e);
E get();
int size();
}
public class SBlockingQueue<E> implements BlockingQueue1<E> {
private final static int DEFAULT_MAX_COUNT = 10;
private final int maxCount;
private final ArrayDeque<E> blockingQueue;
public SBlockingQueue() {
this(DEFAULT_MAX_COUNT);
}
public SBlockingQueue(int size) {
blockingQueue = new ArrayDeque<>(size);
maxCount = size;
}
@Override
public void put(E e) {
synchronized (blockingQueue) {
while (blockingQueue.size() == maxCount) {
try {
System.out.println("队列满了,等待消费数据");
blockingQueue.wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
blockingQueue.add(e);
blockingQueue.notifyAll();
}
}
@Override
public E get() {
synchronized (blockingQueue) {
while (blockingQueue.size() == 0) {
try {
System.out.println("队列中暂时还没数据,等待生产数据");
blockingQueue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
blockingQueue.notifyAll();
return blockingQueue.removeFirst();
}
}
@Override
public int size() {
return blockingQueue.size();
}
}