美文网首页
使用wait和notify模拟简单阻塞队列

使用wait和notify模拟简单阻塞队列

作者: 瓜尔佳_半阙 | 来源:发表于2017-10-25 01:47 被阅读17次

关键字

synchronized、wait、notify

使用wait&notify&synchronized模拟简单队列代码

*wait&notify实现线程间通信需要配合synchronized的使用

//我试试这个markdown语法好不好用
public class QueueTest {
    //声明一个集合,用于元素存储
    private final LinkedList<Object> list = new LinkedList<>();
    //声明一个计数器,用于和队列的范围进行比较
    private AtomicInteger count = new AtomicInteger(0);
    //声明最大范围和最小范围
    private Integer maxSize;
    private Integer minSize = 0;
    //声明一个构造器初始化queue的最大容量
    public QueueTest(Integer maxSize){
        this.maxSize = maxSize;
    }
    //声明一个对象,用于加锁
    private Object lock = new Object();

    //声明put方法,用于向queue中添加数据
    public void put(Object object){
        synchronized (lock){
            //当计数器为最大值时,等待,,,
            while(maxSize == count.get()){
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            list.add(object);
            count.incrementAndGet();
            System.out.println("新加入元素---" + object);
            //唤醒可能在等待获取元素的线程
            lock.notify();
        }
    }

    //取出元素
    public Object take(){
        Object obj = null;
        synchronized (lock){
            while(minSize == count.get()){
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            obj = list.removeFirst();
            count.decrementAndGet();
            System.out.println("取出的元素-----" + obj);
            lock.notify();
        }
        return obj;
    }

    public int get(){
        return count.get();
    }
    
    //测试
    public static void main(String[] args){
        QueueTest qt = new QueueTest(5);
        qt.put("a");
        qt.put("b");
        qt.put("c");
        qt.put("d");
        qt.put("e");
        System.out.println("当前queue大小 " + qt.get());
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                qt.put("f");
                qt.put("g");
            }
        });
        t1.start();

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                Object o1 = qt.take();
                Object o2 = qt.take();
            }
        });

        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.start();
    }

}

相关文章

网友评论

      本文标题:使用wait和notify模拟简单阻塞队列

      本文链接:https://www.haomeiwen.com/subject/hhjfpxtx.html