自定义一个简单的阻塞队列

来源:互联网 发布:jpg用什么软件 编辑:程序博客网 时间:2024/06/10 11:46

通过LinkedList实现一个简单的阻塞队列,实现put和get方法

public class MyBlockingQueue<T> {    private  LinkedList<T> linkedList = new LinkedList<>();    private  AtomicInteger count = new AtomicInteger(0);    private  int minSize = 0;    private  int maxSize;    private Object lock = new Object();    public MyBlockingQueue(int maxSize){        this.maxSize = maxSize;    }    public void put(T t){        synchronized (lock){            while(count.get() == maxSize){                try {                   lock.wait();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            linkedList.add(t);            count.incrementAndGet();            System.out.println(" 元素 " + t + " 被添加 ");            lock.notify();        }    }    public T take(){        T temp;        synchronized (lock){            while (count.get() == minSize){                try {                    lock.wait();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            temp = linkedList.removeFirst();            count.decrementAndGet();            System.out.println(" 元素 " + temp + " 被消费 ");            lock.notify();        }        return temp;    }    public int getSize(){        return count.get();    }    public static void main(String[] args) {        MyBlockingQueue<String> queue = new MyBlockingQueue<String>(5);        queue.put("a");        queue.put("b");        queue.put("c");        queue.put("d");        queue.put("e");        new Thread(new Runnable() {            @Override            public void run() {                queue.put("+1");                queue.put("+2");            }        }).start();        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        new Thread(new Runnable() {            @Override            public void run() {                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                queue.take();                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                queue.take();            }        }).start();    }}