程序代码如下:
public class MyQueue<E> { //1. 提供集合容器 private List<E> list = new ArrayList<E>(); //2. 提供计数器 private AtomicInteger counter = new AtomicInteger(); //3. 提供 上限 下限 private int MAX; private int MIN = 0; //4. 提供锁对象 private Object lock = new Object(); public MyQueue(int max){ this.MAX = max; } //5. put public void put(E e){ synchronized (lock){ while (counter.get() == MAX){ try { lock.wait(); } catch (InterruptedException e1) { e1.printStackTrace(); } } list.add(e); System.out.println("put " + e); counter.incrementAndGet(); lock.notify(); } } //6. take public E take(){ E e = null; synchronized (lock){ while (counter.get() == MIN){ try { lock.wait(); } catch (InterruptedException e1) { e1.printStackTrace(); } } e = list.remove(0); System.out.println("take " + e); counter.decrementAndGet(); lock.notify(); } return e; } public static void main(String[] args) { final MyQueue<String> queue = new MyQueue<String>(5); Thread t1 = new Thread(new Runnable() { @Override public void run() { queue.put("a"); queue.put("b"); queue.put("c"); queue.put("d"); queue.put("e"); queue.put("f"); queue.put("g"); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { queue.take(); queue.take(); } }); t1.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } t2.start(); } }
思路分析:
队列中的元素需要储存,可以简单考虑为List集合储存
既然是模拟实现阻塞队列,那么队列应该有容量限制,上限和下限
应该提供一个计数器的功能,告知什么时候队列可以写入,什么时候必须等待,最好的选择当然是Atomic类
wait/notify依赖于锁,所以提供锁对象
本文出自 “学海无涯 心境无限” 博客,请务必保留此出处http://zhangfengzhe.blog.51cto.com/8855103/1875991
原文地址:http://zhangfengzhe.blog.51cto.com/8855103/1875991