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 的时候,进行查阅便能够了。