1. 概述
① 为什么要使用队列
用队列可以在线程之间传递数据:生产者消费者模型,银行转账等地方
假如队列是线程安全的,那么我们就不用考虑了,只需从中取或者添加使用就行了;那也就是说考虑锁等线程安全问题的重任从使用者转移到了队列上
② 并发队列
③ 阻塞队列
阻塞队列是具有阻塞功能的队列,所以他首先是一个队列,其次是具有阻塞功能
通常,阻塞的队列的一端是给生产者放数据用的,另一端是给消费者拿数据用的;阻塞队列是线程安全的,所以生产者和消费者都可以是多线程的
take()//获取并移除队列的头节点,队列中没有数据则阻塞
put()//插入数据,但是如果队列已满,则阻塞
add()//如果满了会抛出异常
remove()//如果空了会抛出移除
element()//返回头,如果没有抛出异常
offer()//满了返回false
poll()//空了返回null
peek()//空了返回null
阻塞队列是线程池的重要组成部分
2. ArrayBlockingQueue
- 有界,可以指定容量
- 可以指定公平还是不公平
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(3,true);