5. 阻塞队列
5.1 生产者消费者概念
生产者消费者是设计模式的一种。让生产者和消费者基于一个容器来解决强耦合问题。
生产者
消费者
彼此之间不会直接通讯的,而是通过一个容器(队列)进行通讯。
所以生产者生产完数据后扔到容器中,不用等待消费者来处理
。
消费者不需要去找生产者要数据
,直接从容器中获取即可。
而这种容器最常用的结构就是队列。
5.2 JUC阻塞队列的存取方法
常用的存取方法都是来自于JUC包下的BlockingQueue
- 生产者存储方法
add(E)
// 添加数据到队列,如果队列满了,无法存储,抛出异常
offer(E)
// 添加数据到队列,如果队列满了,返回false
offer(E,timeout,unit)
// 添加数据到队列,如果队列满了,阻塞timeout时间
,如果阻塞一段时间,依然没添加进入,返回false
put(E)
// 添加数据到队列,如果队列满了,挂起线程,等到队列中有位置,再扔数据进去,死等
!
- 消费者取数据方法
remove()
// 从队列中移除数据,如果队列为空,抛出异常
poll()
// 从队列中移除数据,如果队列为空,返回null,么的数据
poll(timeout,unit)
// 从队列中移除数据,如果队列为空,挂起线程timeout时间,等生产者扔数据,再获取
take()
// 从队列中移除数据,如果队列为空,线程挂起,一直等到生产者扔数据,再获取
5.3 ArrayBlockingQueue
5.3.1 ArrayBlockingQueue的基本使用
ArrayBlockingQueue在初始化的时候,
必须指定当前队列的长度
。因为ArrayBlockingQueue是基于数组实现的队列结构,数组长度不可变
,必须提前设置数组长度信息。