自己实现阻塞队列的话可以采用Object下的wait和notify方法,也可以使用Lock锁提供的Condition来实现,本文就是自己手撸的一个简单的阻塞队列。最近面试京东时遇到让实现阻塞队列的思路,希望本文能对大家有帮助。个人手撸如有错误还请批评指正。
public class BoundedBlockQueue { // 队列容器 private LinkedList<Object> buffer; private int maxSize; private Lock lock; private Condition fullCondition; private Condition unFullCondition; public BoundedBlockQueue(int maxSize) { buffer = new LinkedList<>(); this.maxSize = maxSize; lock = new ReentrantLock(); fullCondition = lock.newCondition(); unFullCondition = lock.newCondition(); } private void put(Object obj) { lock.lock(); try { while (buffer.size() >= maxSize) { System.out.println("阻塞队满了"); fullCondition.await(); } } catch (InterruptedException e) { fullCondition.signal(); e.printStackTrace(); } buffer.add(obj); unFullCondition.signal(); } private Object get() { Object obj = null; lock.lock(); try { while (buffer.size() ==0 ) { System.out.println("阻塞队空了"); unFullCondition.await(); } obj = buffer.poll(); fullCondition.signal(); } catch (InterruptedException e) { e.printStackTrace(); } return obj; } public static void main(String[] args) { BoundedBlockQueue queue2 = new BoundedBlockQueue(5); Thread t1 = new Thread(() -> { for (int i = 0; i < 100; i++) { queue2.put(i); System.out.println("塞入" + i); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread t2 = new Thread(() -> { for (;;) { System.out.println("消费"+queue2.get()); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } }); t1.start(); t2.start(); } }