有界阻塞队列,通常用于保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入 wait 状态,释放 cpu 资源,在线程池中,有界阻塞队列也通常作为工作队列的实现。
我们可以自己实现一个有界阻塞队列,笔者这里使用了 Lock 锁的形势实现了一个简单的有界阻塞队列。
代码如下:
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Author: fengluo
* @Date: 2022/10/2 22:24
*/
public class MyBlockingQueue {
private int capacity = 10;
private final Queue<Object> queue = new LinkedList<>();
private final Lock lock = new ReentrantLock();
private final Condition canPut = lock.newCondition();
private final Condition canDel = lock.newCondition();
public MyBlockingQueue() {
}
public MyBlockingQueue(int capacity) {
this.capacity = capacity;
}
public void enqueue(Object task) {
lock.lock();
try {
while (queue.size() >= capacity) {
canPut.await();
}
queue.offer(task);
canDel.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public Object dequeue() {
Object res = new Object();
lock.lock();
try {
while (queue.size() <= 0) {
canDel.await();
}
res = queue.poll();
canPut.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return res;
}
public int size() {
int res = 0;
lock.lock();
try {
res = queue.size();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return res;
}
}