基于java实现一个有限阻塞式生产者消费者队列队列(简单易懂)
2021/12/5 17:46:36
本文主要是介绍基于java实现一个有限阻塞式生产者消费者队列队列(简单易懂),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文介绍了如何基于Condition实现一个有限阻塞式生产者消费者队列:代码如下:
public class BoundedBlockingQueue { AtomicInteger size = new AtomicInteger(0); private volatile int capacity; //自己实现阻塞队列,需要一个容器,内部实现了一个node,如果改造为不只是int的,使用T泛型 private LinkedList<Integer> container; //可重入锁 private static ReentrantLock lock = new ReentrantLock(); Condition procuder = lock.newCondition();//用来通知生产(入队)线程等待await还是可以执行signal Condition consumer = lock.newCondition();//用来通知消费(出队)线程等待await还是可以执行signal public BoundedBlockingQueue(int capacity) { this.capacity = capacity; container = new LinkedList<>(); } /** * 入队 * * @param element * @throws InterruptedException */ public void enqueue(int element) throws InterruptedException { //每一个线程都会获得锁,但是如果条件不满足则会阻塞 lock.lock(); try { //阻塞的话必须用循环,让这个线程再次获得cpu片段的时候能够够执行 while (size.get() >= capacity) { //入队线程阻塞,把锁释放? procuder.await(); } container.addFirst(element); size.incrementAndGet(); //通知出队线程 consumer.signal(); } finally { lock.unlock(); } } public int dequeue() throws InterruptedException { lock.lock(); try { while (size.get() == 0) { consumer.await(); } int lastValue = container.getLast(); container.removeLast(); size.decrementAndGet(); //通知入队线程 procuder.signal(); return lastValue; } finally { lock.unlock(); } } public int size() { return size.get(); } }
这篇关于基于java实现一个有限阻塞式生产者消费者队列队列(简单易懂)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-28AI给的和自己写的Python代码,都无法改变输入框的内容,替换也不行
- 2024-09-27Sentinel配置限流资料:新手入门教程
- 2024-09-27Sentinel配置限流资料详解
- 2024-09-27Sentinel限流资料:新手入门教程
- 2024-09-26Sentinel限流资料入门详解
- 2024-09-26Springboot框架资料:初学者入门教程
- 2024-09-26Springboot框架资料详解:新手入门教程
- 2024-09-26Springboot企业级开发资料:新手入门指南
- 2024-09-26SpringBoot企业级开发资料新手指南
- 2024-09-26Springboot微服务资料入门教程