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的时候,进行查阅便可以了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。