逐梦少年,看你能不能发现宝藏(15)


队列的种类分析:
?: 由数组结构组成的有界阻塞队列 。
?: 由链表结构组成的有界(但大小默认值为.//这个值太大了,大约21亿//)阻塞队列
? e : 支持优先级排序的无界队列
?: 使用优先级队列实现的延迟无界阻塞队列
?:不存储元素的阻塞队列,也即单个元素的队列 。专属定制版—》生产一个,消费一个 。。。
?: 由链表结构组成的无界阻塞队列 。
?: 由链表结构组成的双向阻塞队列 。
方法类型抛出异常特殊值阻塞超时
插入
add(e)
offer(e)
put(e)
offer(e,time,unit)
移除
()
poll()
take()
poll(time,unit)
检查
()
peek()
不可用
不可用
抛出异常当阻塞队列满时,再往队列里add插入一个元素会抛出n:Queue full
当阻塞队列空时,再往队列里面移除元素会抛出on
特殊值
插入方法,成功true失败false
移除方法,成功返回出队列的元素,队列里面没有就返回null
一直阻塞
当阻塞队列满时,生产者线程继续往队列里put元素,队列会一直阻塞生产线程直到put数据or相应中断退出 。
当阻塞队列空时,消费者线程试图从队列里take元素,队列会一直阻塞消费者线程直到队列可用 。
超时退出
当阻塞队列满时,队列会阻塞生产者线程一定时间,超过时间后限时后生产者线程会退出
public class BlockingQueueDemo {public static void main(String[] args) {//List list = new ArrayList();BlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);blockingQueue.offer("a",2L ,TimeUnit.SECONDS);blockingQueue.offer("a",2L ,TimeUnit.SECONDS);blockingQueue.offer("a",2L ,TimeUnit.SECONDS);blockingQueue.offer("a",2L ,TimeUnit.SECONDS);/*blockingQueue.put("a");blockingQueue.put("a");blockingQueue.put("a");System.out.println("=====================================");blockingQueue.put("x");*//*System.out.println(blockingQueue.add("a"));System.out.println(blockingQueue.add("b"));System.out.println(blockingQueue.add("c"));System.out.println(blockingQueue.element());System.out.println(blockingQueue.remove());System.out.println(blockingQueue.remove());System.out.println(blockingQueue.remove());*/System.out.println(blockingQueue.offer("a"));System.out.println(blockingQueue.offer("a"));System.out.println(blockingQueue.offer("a"));System.out.println(blockingQueue.offer("a"));System.out.println(blockingQueue.peek());System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());}}
:没有容量 。与其他不同,是一个不存储元素的.每一个put操作必须要等待一个take操作,否则不能继续添加元素,反之亦然 。
/** 阻塞队列SynchronousQueue演示*/public class SynchronousQueueDemo {public static void main(String[] args) {SynchronousQueue queue = new SynchronousQueue<>();new Thread(()->{try {System.out.println(Thread.currentThread().getName() + "\t put 1");queue.put("1");System.out.println(Thread.currentThread().getName() + "\t put 2");queue.put("2");System.out.println(Thread.currentThread().getName() + "\t put 3");queue.put("3");} catch (InterruptedException e) {e.printStackTrace();}},"AAA").start();new Thread(()->{try {try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }System.out.println(queue.take());try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }System.out.println(queue.take());try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }System.out.println(queue.take());} catch (InterruptedException e) {e.printStackTrace();}},"BBB").start();}}===============================================================================AAAput 11AAAput 22AAAput 33