Queue
并发队列(非线程安全):
PriorityQueue
优先级队列,队列中的数据在插入时会排序,因此如果是自定义类,需要派生Comparable,通过排序实现了优先权。
ConcurrentLinkedQueue
是一个基于链接节点的无界线程安全队列。
阻塞队列(线程安全):
ArrayBlockingQueue
基于数组,是有界的,new时必须指定队列的大小。
LinkedBlockingQueue
基于链表,是无界的,可以不指定队列的大小,但是默认是Integer.MAX_VALUE。当然也可以指定队列大小,从而成为有界的。
PriorityBlockingQueue(优先级队列)
DelayQueue
延迟队列,是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。其内部是使用PriorityQueue实现的。适用场景:
a) 关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。
b) 缓存。缓存中的对象,超过了空闲时间,需要从缓存中移出。
c) 任务超时处理。在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求。
http://www.cnblogs.com/jobs/archive/2007/04/27/730255.html
追加元素 | |
add | 超出队列长度时,抛出一个IIIegaISlabEepeplian异常 |
offer | 超出队列长度时返回false |
put | 超出队列长度时阻塞 |
删除第一个元素 | |
remove | 队列为空时抛出一个NoSuchElementException异常 |
poll | 队列为空时返回null |
take | 超出队列长度时阻塞 |
注:remove可以带一个参数,表示删除某一元素,返回bool值。
获取第一个元素,不删除 | |
element | 队列为空时抛出一个NoSuchElementException异常 |
peek | 队列为空时返回null |
例:
ArrayBlockingQueue<Integer> nums = new ArrayBlockingQueue(5);
nums.add(6);
nums.add(7);
nums.add(8);
nums.add(4);
nums.add(5);
// nums.add(6);// 超出队列长度时,抛出一个IIIegaISlabEepeplian异常
System.out.println(nums.toString());// [6, 7, 8, 4, 5]
System.out.println(nums.remove());// 删除第一个元素,队列为空时抛出一个NoSuchElementException异常
System.out.println(nums.toString());// [7, 8, 4, 5]
System.out.println(nums.remove(8));// 删除元素8
System.out.println(nums.toString());// [7, 4, 5]
System.out.println(nums.element());// 获取第一个元素,不删除,队列为空时抛出一个NoSuchElementException异常
System.out.println(nums.toString());// [7, 4, 5]
boolean bOffer1 = nums.offer(8);
boolean bOffer2 = nums.offer(9);
boolean bOffer3 = nums.offer(10);// 添加数据,超出队列长度时返回false
System.out.println(bOffer3 + nums.toString());// false[7, 4, 5, 8, 9]
System.out.println(nums.poll());// 删除第一个元素,队列为空时返回null
System.out.println(nums.toString());// [4, 5, 8, 9]
System.out.println(nums.peek());// 返回第一个元素,队列为空时返回null
System.out.println(nums.toString());// [4, 5, 8, 9]
try {
nums.put(11);
//nums.put(12);// 添加元素,如果队列满了则阻塞
System.out.println(nums.toString());// [4, 5, 8, 9, 11]
Integer num = nums.take();// 删除第一个元素,如果队列空则阻塞
System.out.println(num);
System.out.println(nums.toString());// [5, 8, 9, 11]
} catch (InterruptedException e) {
e.printStackTrace();
}