• 并发包(JUC)之阻塞队列


    1、阻塞队列分类

        

    2、阻塞队列原理 

      基于ReentrantLock和Condition实现阻塞和线程间的通信。

        Condition  notEmpty = lock.newCondition( ) 

        Condition  notFull = lock.newCondition( )

      (1)添加元素方法:add、offer、put

        ——add,添加元素失败会抛异常(其实是调用offer,发现返回false则抛出异常)

        ——offer,返回true或false

        ——put,只有put方法是阻塞的:当发现队列已经满了,则将当前线程添加到notFull 的等待队列(Condition队列)中挂起。    

    while(count == items.length){
           notFull.await();  
    }

      (2)获取(删除)元素方法:take、poll、remove

        ——remove,删除失败会抛异常

        ——poll,返回true或false

        ——take,只有take是阻塞的:当发现队列是空的,则将当前线程添加到notEmpty的等待队列中挂起。

    while(count == 0){
           notEmpty.await();
    }

      如何唤醒notFull和notEmpty等待队列中阻塞的线程?

        *  当添加元素时,调用enqueue()——>notEmpty.signal()。新的元素添加,会唤醒notEmpty中阻塞的线程,让想要获取元素的线程可以去获取新添加的元素。

        *  当获取元素时,调用dequeue()——>notFull.signal()。有元素被获取后,会唤醒notFull中阻塞的线程,让想要添加元素的线程可以继续向里面添加元素。

  • 相关阅读:
    MYSQL设置允许所有访问
    解决ios端的H5,input有阴影的问题
    linux查看某个时间段的日志(sed -n)
    centos如何创建自启动脚本
    laravel做数据迁移的时候进行表的注释
    taro编译微信小程序,报错“未找到setmap.json文件”
    java百科常识
    spring自动装配
    top命令内容详解
    jemter 随机取数组里面的值放入请求
  • 原文地址:https://www.cnblogs.com/jing-yi/p/12774528.html
Copyright © 2020-2023  润新知