package com.gxx.record.utils; import java.util.LinkedList; import java.util.List; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 阻塞队列 * 0.size 上限大小 * 1.add 添加,达到上限大小,hold住 * 2.remove 获取,大小为0,hold住 * @author Gxx */ public class BlockingQueue { /** * 上限大小 */ private int size = 5; /** * 内容 */ private List list = new LinkedList(); /** * 锁 */ private Lock lock = new ReentrantLock(); /** * 非满条件 */ private Condition notFull = lock.newCondition(); /** * 非空条件 */ private Condition notEmpty = lock.newCondition(); /** * 构造函数 */ public BlockingQueue () { } /** * 构造函数 * @param size */ public BlockingQueue (int size) { this.size = size; } /** * 添加,达到上限大小,hold住 * @param object */ public void add(Object object) { lock.lock(); try { if(size == list.size()) { System.out.println(" [->添加]挂起,满了:共" + list.size() + "个"); notFull.await(); System.out.println(" [->添加]唤醒,不满了:共" + list.size() + "个"); } list.add(object); System.out.println(" [->添加]了1个,尝试唤醒:共" + list.size() + "个"); notEmpty.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } /** * 获取,大小为0,hold住 */ public Object remove() { Object object = null; lock.lock(); try { if(0 == list.size()) { System.out.println("[<-获取]挂起,空了:共" + list.size() + "个"); notEmpty.await(); System.out.println("[<-获取]唤醒,不空了:共" + list.size() + "个"); } object = list.remove(0); System.out.println("[<-获取]删除了1个,尝试唤醒:共" + list.size() + "个"); notFull.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } return object; } }