/** * @描述: 阻塞隊列 ,先放進來先取走 * 緩衝區:隔離效果,平均每一秒鐘收一個短信,放在池子裏 * 能夠放能夠取,當滿了不能放,取走了以後才能取 * 當空的時候不能取,只有放了以後才能取 * @做者: Wnj . * @建立時間: 2017年5月16日 . * @版本: 1.0 . */ public class BoundedBuffer { final Lock lock = new ReentrantLock(); //空 ,一個Condition有五個線程同時往池子裏放,發現緩衝區滿了,都阻塞了,結果有一個去取了,五個中有一個喚醒了,取完喚醒,那麼只能喚醒取的,不能喚醒放的 final Condition notFull = lock.newCondition(); //滿 final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; public void put(Object x) throws InterruptedException { lock.lock(); try { //若是格子已滿 while (count == items.length) notFull.await(); items[putptr] = x; //指針 if (++putptr == items.length) //從0開始放 putptr = 0; //存入一個值的時候對count進行++ ++count; notEmpty.signal(); } finally { lock.unlock(); } } public Object take() throws InterruptedException { lock.lock(); try { //沒有值的時候進行等待 while (count == 0) notEmpty.await(); Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; //取走一個值的時候對count-- --count; //喚醒 notFull.signal(); return x; } finally { lock.unlock(); } } }