package com.example.demo.webservice;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BlockQueue<T> {
private int size;
private Object[] queue;
private Lock lock=new ReentrantLock();
private Condition full=lock.newCondition();
private Condition empty=lock.newCondition();
private int index;
private int removeIndex;
private int currLen;
public BlockQueue(int size) {
this.index = 0;
this.removeIndex = 0;
this.currLen = 0;
this.size = size;
queue = new Object[size];
}
public BlockQueue() {
this(10);
}
public void push(T element) throws InterruptedException {
lock.lock();
try {
while (currLen == size) {
System.out.println("隊列滿。。。");
full.await();
}
queue[index] = element;
if (++index == size) {
index = 0;
}
currLen++;
empty.signal();
} finally {
lock.unlock();
}
}
public T pop() throws InterruptedException {
lock.lock();
try {
while (currLen == 0) {
System.out.println("隊列空。。。");
empty.await();
}
Object obj = queue[removeIndex];
if (++removeIndex == size) {
removeIndex = 0;
}
currLen--;
full.signal();
return (T) obj;
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
BlockQueue<Integer> blockQueue = new BlockQueue<Integer>(3);
Thread t1=new Thread(()->{
for(int i=0;i<100;i++){
try {
System.out.println("生產者生產的數字是: "+i);
blockQueue.push(i);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2=new Thread(()->{
while(true){
try {
System.out.println("消費者消費的的數字是: "+blockQueue.pop());
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
}
}