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、

posted @ 2022-12-30 05:26  Amireux-126  阅读(31)  评论(0)    收藏  举报