1.阻塞队列的基本概念

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

1.阻塞队列的基本概念用
咱们在介绍阻塞队列前,先看一张图:

这是一个最根本的生产者和消费者的模型图,一个线程放数据,一个线程取数据。两头是放数据的队列,队列就是一个盛放数据的数组。
阻塞队列:
当阻塞队列是空的,从队列中获取元素的操作将会被阻塞。
当阻塞队列是满的,往队列里增加元素的操作会被阻塞。
直到其中的线程从队列中移除一个或者有线程往里插入数据时,将不会阻塞。
而JAVA中,咱们次要应用的阻塞接口,就是BlockingQueue!

BlockingQueue<E>


由上图能够看出,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");

后果是抛出异样:

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

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

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

后果为:

阻塞期待组

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

如果阻塞队列满了,那么直到阻塞队列存中的音讯被生产之前,就始终阻塞。

如图:主线程始终在运行

接下来是超时期待组
阻塞期待就是在队列阻塞的时候,如果超过肯定的工夫,就放弃期待:

    //阻塞期待组        blockingQueue.offer("e", 1, TimeUnit.SECONDS);        blockingQueue.offer("e", 1, TimeUnit.SECONDS);        blockingQueue.offer("e", 1, TimeUnit.SECONDS);        blockingQueue.offer("e", 5, TimeUnit.SECONDS);


能够看出咱们的程序运行了一会儿之后就完结了。

总结:
这篇文章咱们简略地介绍了一下阻塞队列以及其API的应用,能够截图保留下面的表格,在当前须要应用到API的时候,进行查阅便能够了。