前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >队列 LinkedBlockingQueue 原

队列 LinkedBlockingQueue 原

作者头像
wuweixiang
发布2018-08-14 14:49:55
3560
发布2018-08-14 14:49:55
举报
文章被收录于专栏:吴伟祥吴伟祥

1 api

    java.util.concurrent包下的新类。LinkedBlockingQueue就是其中之一,是一个阻塞的线程安全的队列,底层采用链表实现。

      LinkedBlockingQueue构造的时候若没有指定大小,则默认大小为Integer.MAX_VALUE,当然也可以在构造函数的参数中指定大小。LinkedBlockingQueue不接受null。

    添加元素的方法有三个:add,put,offer,且这三个元素都是向队列尾部添加元素的意思。

    区别:

        add方法在添加元素的时候,若超出了度列的长度会直接抛出异常: 

      put方法,若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间,以加入元素。 

    offer方法在添加元素时,如果发现队列已满无法添加的话,会直接返回false。     

    从队列中取出并移除头元素的方法有:poll,remove,take。     

        poll: 若队列为空,返回null。

        remove:若队列为空,抛出NoSuchElementException异常。

        take:若队列为空,发生阻塞,等待有元素。

2基于LinkedBlockingQueue的生产者和消费者

3示例2

 并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。

 下面的例子比较简单,一个读线程,用于将要处理的文件对象添加到阻塞队列中,

 另外四个写线程用于取出文件对象,为了模拟写操作耗时长的特点,特让线程睡眠一段随机长度的时间。另外,该Demo也使用到了线程池和原子整型(AtomicInteger),AtomicInteger可以在并发情况下达到原子化更新,避免使用了synchronized,而且性能非常高。由于阻塞队列的put和take操作会阻塞,为了使线程退出,特在队列中添加了一个“标识”,算法中也叫“哨兵”,当发现这个哨兵后,写线程就退出。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 api
  • 2基于LinkedBlockingQueue的生产者和消费者
  • 3示例2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档