JUC

BlockingQueue


BlockingQueue即阻塞队列,它是基于ReentrantLock,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所示:

概念:

  • 当队列是空的,试图获取元素将阻塞
  • 当队列是满的,试图添加元素将阻塞

为什么需要阻塞队列:

我们不需要关心什么时候阻塞线程,一旦条件满足,被挂起的线程会自动唤醒。

主要实现类:

  • ArrayBlockingQueue:由数组组成的有界队列
  • LinkedBlockingQueue:由链表组成的有界队列(默认大小是Integer.MAX—VALUE)
  • SynchronousQueue:不存储元素的阻塞队列,即单个元素的队列
  • LinkedBlockingDeque:由链表组成的双向阻塞队列。

核心方法:

方法类型 抛出异常 特殊值 阻塞 超时
插入 add(e) offer(e) put(e) offer(e,time,unit)
移除 remove() poll() take() poll(e,unit)
检查 element() peek() 不可用 不可用

 

抛出异常

阻塞队列满,执行add抛出异常:IllegalStateException: Queue full

阻塞队列空,remove抛出异常:NoSuchElementException

特殊值

插入 成功true,失败false

移除 成功返回出队列的元素,失败返回null

一直阻塞

阻塞度列满时,生产者继续put,队列一直阻塞线程知道put or 响应中断退出

阻塞队列空时,消费者take元素,队列会一直阻塞消费线程直到队列有数据

超时退出 阻塞队列满时,队列阻塞生产者一段时间,超市后生产者线程退出

 

  • 作者:低调做个路人 (扫码联系作者)
  • 发表时间:2019-12-02 13:43:22
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 评论