public class ZerahBlockQueue {
private List<Integer> container = new ArrayList<>();
private Lock lock = new ReentrantLock();
private Condition isNull = lock.newCondition();
private Condition isFull = lock.newCondition();
private volatile int size;
private volatile int capacity;
ZerahBlockQueue(int cap) {
this.capacity = cap;
}
public void add(int data) {
try {
lock.lock();
try {
while (size >= capacity) {
System.out.println("队列已满,释放锁,等待消费者消费数据");
isFull.await();
}
} catch (InterruptedException e) {
isFull.signal();
e.printStackTrace();
}
++size;
container.add(data);
isNull.signal();
} finally {
lock.unlock();
}
}
public int take(){
try {
lock.lock();
try {
while (size == 0){
System.out.println("阻塞队列空了,释放锁,等待生产者生产数据");
isNull.await();
}
}catch (InterruptedException e){
isFull.signal();
e.printStackTrace();
}
--size;
int res = container.get(0);
container.remove(0);
isFull.signal();
return res ;
}finally {
lock.unlock();
}
}
}
public class MyBlockQueueTest {
public static void main(String[] args) {
ZerahBlockQueue queue = new ZerahBlockQueue(5)
Thread thread1 = new Thread(() -> {
for (int i = 0
queue.add(i)
System.out.println("拉个:" + i)
try {
Thread.sleep(500)
}catch (InterruptedException e){
e.printStackTrace()
}
}
})
Thread thread2 = new Thread(() -> {
for(
System.out.println("屎壳郎开始工作,消费:" + queue.take())
try {
Thread.sleep(800)
}catch (InterruptedException e){
e.printStackTrace()
}
}
})
thread1.start()
thread2.start()
}
}