JAVA并发编程——阻塞队列理论及其API介绍

苏凌峰

1.阻塞队列的基本概念

2.阻塞队列的常用API介绍

1.阻塞队列的基本概念用
我们在介绍阻塞队列前,先看一张图:
image.png
这是一个最基本的生产者和消费者的模型图,一个线程放数据,一个线程取数据。中间是放数据的队列,队列就是一个盛放数据的数组。
阻塞队列:
当阻塞队列是空的,从队列中获取元素的操作将会被阻塞。
当阻塞队列是满的,往队列里添加元素的操作会被阻塞。
直到其中的线程从队列中移除一个或者有线程往里插入数据时,将不会阻塞。
而JAVA中,我们主要使用的阻塞接口,就是BlockingQueue!

BlockingQueue<E>

image.png
由上图可以看出,BlockingQueue的接口继承Queue接口,而Queue接口和List接口又同时继承于Collection接口, 我们常用的阻塞队列类型有三种:

ArrayBlockingQueue : 由数组构成的有界阻塞队列
LinkedBlockingQueue : 由链表组成的有界(但是默认值为Integer.MAX_VALUE阻塞队列)
SynchronousQueue : 不存储元素的阻塞队列,即单个元素的队列。

2.阻塞队列的常用API介绍

我先列出一个表,以后使用API查询这个表格就可以了,然后进行挨个地演示和测验

方式抛出异常不抛出异常,有返回值阻塞等待超时等待
添加add()offer()put()offer(E e, long timeout, TimeUnit unit)
删除remove()poll()take()poll(E e, long timeout, TimeUnit unit)
判断队列值element()peek()

我们就用一个长度为3的普通数组阻塞队列拿来测试:

BlockingQueue<String> blockingQueue = new ArrayBlockingQueue(3);

首先是,抛出异常组

        //抛出异常组API
        blockingQueue.add("b");
        blockingQueue.add("c");
        blockingQueue.add("d");
        blockingQueue.add("d");

结果是抛出异常:
image.png

剩下的两个方法,当队列为空的时候,都抛出异常,在这里我就不演示了。

接下来是不抛出异常,有返回值组

        //返回值组
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("a"));

结果为:
image.png

阻塞等待组

        //阻塞等待组
        blockingQueue.put("e");
        blockingQueue.put("e");
        blockingQueue.put("e");
        blockingQueue.put("e");

如果阻塞队列满了,那么直到阻塞队列存中的消息被消费之前,就一直阻塞。

image.png

如图:主线程一直在运行

接下来是超时等待组
阻塞等待就是在队列阻塞的时候,如果超过一定的时间,就放弃等待:

    //阻塞等待组

        blockingQueue.offer("e", 1, TimeUnit.SECONDS);
        blockingQueue.offer("e", 1, TimeUnit.SECONDS);
        blockingQueue.offer("e", 1, TimeUnit.SECONDS);
        blockingQueue.offer("e", 5, TimeUnit.SECONDS);

image.png
可以看出我们的程序运行了一会儿之后就结束了。

总结:
这篇文章我们简单地介绍了一下阻塞队列以及其API的使用,可以截图保存上面的表格,在以后需要使用到API的时候,进行查阅便可以了。

阅读 170

你的迷惑在于想得太多而书读的太少。

4 声望
4 粉丝
0 条评论
你知道吗?

你的迷惑在于想得太多而书读的太少。

4 声望
4 粉丝
宣传栏