它名字中虽然带着Blocking,但put方法并不是阻塞的(take方法阻塞),如果使用不当,极易造成OOM问题
对此可以对这个类进行修饰,重写put和take方法,如下:
private ReentrantLock lock = new ReentrantLock();
private Condition full = lock.newCondition();
private BlockingQueue<Object> queue = new PriorityBlockingQueue<>(200);
private int maxSize;
// 构造方法,参数为queue大小
@Override public void put(Object obj) throws InterruptedException { lock.lockInterruptibly(); try { while (queue.size() > this.maxSize) { full.await(); } queue.put(extend); } finally { lock.unlock(); } } @Override public Object take() throws InterruptedException { // 这个take方法要放在lock的外面,因为它是阻塞的,如果放到lock里面,会阻塞住,导致其它线程拿不到锁 Object obj = queue.take(); lock.lockInterruptibly(); try { full.signalAll(); } finally { lock.unlock(); } return obj; }