阻塞队列初级篇
队列分为阻塞队列,无阻塞队列。这篇文章先认识一下阻塞队列。
什么是阻塞队列队列??阻塞比作一个池子,如果队列满了,那么往队列里添加元素的线程就会阻塞。如果队列为空,从队列里获取元素的线程就会阻塞。
队列都是Queue的子类,阻塞队列都是BlockingQueue的子类。
下面介绍一下,每一种BlockingQueue的简单使用。
ArrayBlockingQueue,是一个基于数组的阻塞、有界队列。
-
使用:
- ArrayBlockingQueue<String> array = new ArrayBlockingQueue<String>(5); 必须传递初始容量。
- put()、add()、offer()都可以添加元素
- peek()、poll()、take()可以取出元素,peek()不会删除元素,后面两个会删除元素。
- 因为它是个有界队列,所以如果添加超出容量的元素,会抛出异常:java.lang.IllegalStateException: Queue full
LinkedBlockingQueue,是一个基于列表的阻塞、无界队列。
-
使用:
- LinkedBlockingQueue link = new LinkedBlockingQueue();它是一个无界队列。
- put()、add()、offer()都可以添加元素,不允许添加null
- peek()、poll()、take()可以取出元素,peek()不会删除元素,后面两个会删除元素。
SynchronousQueue,是一个不存储元素的阻塞队列,可以看成是一个传球手,负责把生产者线程处理的数据直接传递给消费者线程。
-
使用:
- SynchronousQueue queue = new SynchronousQueue();
- 如果像这样:queue.add("baiweijing");直接添加元素会抛出异常。
- peek()、poll()、take()可以取出元素,peek()不会删除元素,后面两个会删除元素。
PriorityBlockingQueue,基于优先级的阻塞、无界队列
-
使用:
- PriorityBlockingQueue queue = new PriorityBlockingQueue();
- add()、put()、offer(),即添加之后queue仍然是无序的。
- iter()的结果也是无序的
- peek()、poll()、take()可以取出元素,peek()不会删除元素,后面两个会删除元素。而且是按照顺序取出。
DelayQueue
阻塞队列具体会应用在哪?目前还不了解。持续了解中,持续更新中。。。。