import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BoundedQueue<T> {
private Object[] items;
private int addIndex,removeIndex,count;
private Lock lock=new ReentrantLock();
private Condition empty=lock.newCondition();
private Condition full=lock.newCondition();
public BoundedQueue(int size) {
this.items = new Object[size];
}
public void add(T t) throws InterruptedException {
lock.lock();
try{
while (count==items.length){
full.await();
System.out.println("数组已经满");
}
items[addIndex]=t;
if(++addIndex==items.length)
addIndex=0;
++count;
empty.signal();
}finally {
lock.unlock();
}
}
public T remove() throws InterruptedException {
lock.lock();
try{
while (count==0){
empty.await();
System.out.println("数组已经空");
}
Object x=items[removeIndex];
if(++removeIndex==items.length)
removeIndex=0;
--count;
full.signal();
return (T)x;
}finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
BoundedQueue<Integer> boundedQueue= new BoundedQueue<Integer>(8);
for(int i=0;i<30;i++){
int j=i;
new Thread(()-> {
try {
boundedQueue.add(j);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
Thread.sleep(200);
for(int i=0;i<30;i++){
new Thread(()-> {
try {
boundedQueue.remove();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
}
java 实现阻塞队列
最新推荐文章于 2024-05-21 10:23:42 发布