阻塞队列问题

含义:是一个支持两个附加操作的队列,这两个附加操作分别是:在队列为空的时候,获取元素的线程等待队列变为非空,当队列满时,存储元素的线程会等待队列可用
接口:BlockingQueue< E>
他的所有超级接口:Collection,Iterable,Queue

常用方法:
public Boolean add(E e)将指定的元素插入到此队列中,成功后返回 IllegalStateException,如果当前没有可用空间,则抛出IllegalStateException。
public boolean offer(E e) 将指定的元素插入到此队列中,成功返回true,失败为 false
public void put(E e) 将指定的元素插入到此队列中,如果没有空间则等待可用的时候
public E poll(long timeout, TimeUnit unit) 检索并删除此队列的头,等待指定的等待时间(如有必要)使元素变为可用。
public E take() 检索并删除此队列的头,如有必要,等待元素可用。

常用实现类:
ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue

队列有界性数据结构
ArrayBlockingQueuebounded(有界,即为有容量限制)加锁ArrayList
LinkedBlockingQueueoptionally-bounded(可选有界)加锁LinkedList
SynchronousQueuebounded(有界)加锁

SynchronousQueue是一个不存储元素的阻塞队列,每一个put操作必须等待take操作,否则不能添加元素

		//ArrayBlockingQueue,容量有限制,所以必须指定长度
        BlockingQueue<String> bq = new ArrayBlockingQueue<>(3);
        bq.add("aaa");
        bq.add("bbb");
        bq.add("ccc");
        bq.add("ddd"); //报错
        boolean b=bq.offer("ddd");//没有添加进去,返回false
        bq.put("ddd"); //添加元素,如果队列满了,则等待
        System.out.println(bq.take()); //先进先出原则
		BlockingQueue<String> bq = new SynchronousQueue<>();
        bq.add("aaa"); //报错,不能存储元素
        bq.put("aaa");//一直等待,无法添加元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值