BlockingQueue接口(阻塞队列)
Queue的子接口,阻塞的队列,增加了两个线程状态为无限期等待的方法:
常用方法:
void put(E e);将指定元素插入队列,如果没有可用空间,则等待。 E take();获取并移除该队列头部元素,如果没有,则等待。
使用场景
可用于解决生产者、消费者问题。
实现类
1、ArrayBlockingQueue: 数据结构实现,有界队列。(手动固定队列长度) public static void main(String[] args) { BlockingQueue<String> abq = new ArrayBlockingQueue<>(10); } 2、LinkedBlockingQueue: 链表结构实现,有界队列。(默认上限为Integer.MAX_VALUE) public static void main(String[] args) { BlockingQueue<String> lbq=new LinkedBlockingQueue<>(); }
代码示例
1、创建一个有界队列,添加数据
public static void main(String[] args) throws Exception { //创建一个有界队列 BlockingQueue<String> abq = new ArrayBlockingQueue<>(5); abq.put("aaa"); abq.put("bbb"); abq.put("ccc"); abq.put("ddd"); abq.put("eee"); System.out.println("已经添加了5个元素"); abq.put("fff"); System.out.println("已经添加了6个元素"); }
执行结果
已经添加了5个元素
这是我们会发现下一句打印没有输出。这是因为我们创建的队列长度为5,所以在添加完第5个元素时,队列已经满了,这时候再添加就会进入阻塞状态,等待有空间时才能继续添加元素。
public static void main(String[] args) throws Exception { //创建一个有界队列 BlockingQueue<String> abq = new ArrayBlockingQueue<>(5); abq.put("aaa"); abq.put("bbb"); abq.put("ccc"); abq.put("ddd"); abq.put("eee"); System.out.println("已经添加了5个元素"); //移除首位元素 abq.take(); abq.put("fff"); System.out.println("已经添加了6个元素"); }
已经添加了5个元素
已经添加了6个元素
这时候我们取出元素后,后续的添加操作就可以继续执行了。
2、

浙公网安备 33010602011771号