JAVA中的几种主要的阻塞队列
- ArrayBlockingQueue: 基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象必须指定容量大小。并且可以指定公平性和非公平性,默认情况下为非公平性,即不保存等待时间最长的队列有限能够访问队列。
- LinkedBlockingQueue: 基于链表实现的一个阻塞队列,在创建LinkedBlockingQueue对象如果不指定容量大小,则为Integer.MAX_VALUE.
- PriorityBlockingQueue: 以上2种队列都是先进先出队列,而PriorityBlockQueue却不是,它会按照元素的优先级对元素进行排序,按照优先级顺序出队,每次出队的元素都是优先级最高的元素。注意,此阻塞队列为无界阻塞队列,即容量没有上限。
- DelayQueue: 基于PriorityBlockingQueue: 基于PriortyQueue, 一种延时阻塞队列,DelayQueue中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。DelayQueue也是一种无界队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞。
阻塞队列的几个方法
- put(E e): 向队尾存入元素,如果队列满了,则等待。
- tack(): 从队首取元素,如果队伍为空,则等待。
- offer(E e, long timeout, TimeUnil unit): 如果队列满了则等待一定时间,没有插入成功则返回false,成功则返回true.
- poll(long timeout, TimeUnit unit): 如果队列为空,则等待一定时间,当时间期限达到时,如果未取到,则返回null.
实现
- 阻塞队列实现
|
|
- 使用阻塞队列实现生产者消费者
|
|
- 使用Lock和Condition实现阻塞队列
|
|