ToB企服应用市场:ToB评测及商务社交产业平台

标题: 阻塞队列(BlockingQueue) [打印本页]

作者: 没腿的鸟    时间: 2024-3-26 22:22
标题: 阻塞队列(BlockingQueue)
阻塞队列(BlockingQueue)

一、特点

1、JDK提供的七个阻塞队列简介

①. ArrayBlockingQueue
有界 阻塞队列——必须指定大小——数组
②. LinkedBlockingQueue
有界 阻塞队列——默认大小:Integer.MAX_VALUE最大值——链表
③. LinkedTransferQueue
无界 阻塞队列——链表
④. PriorityBlockingQueue
无界 阻塞队列——支持优先级排序
⑤. DelayQueue
无界 阻塞队列——使用优先级队列实现的
⑥. SynchronousQueue
不存储元素 的阻塞队列
⑦. LinkedBlockingDeque
双端 阻塞队列——链表
2、其他特点

二、阻塞队列的方法

1、插入元素

描述抛出异常一直阻塞返回特殊的值超时退出插入数据add(e)put(e)offer(e)
推荐offer(e, time, unit)
推荐插入成功返回true无返回值返回true返回true插入失败
(队列满)抛异常一直阻塞,直到插入元素返回false等10秒(假如设置的10s)
然后放弃插入,返回false
可用于控制添加元素的速度2、获取元素——并移除队列的头元素

描述抛出异常一直阻塞返回特殊的值超时退出获取元素remove()take()poll()poll(time, unit)获取成功返回元素返回元素返回元素返回元素获取失败
(队列空)抛异常一直阻塞,直到获取到元素返回null等10秒(假如设置的10s)
然后null
可用于控制消费的速度3、获取元素——不移除队列的元素

描述抛出异常返回特殊的值获取元素element()peek()获取成功返回元素返回元素获取失败
(队列空)抛异常返回null4、推荐使用

程序中常用的是 offer() 和 poll() 方法,因为这两个方法比较友好,不会报错。
5、测试

  1. package com.cc.testproject.utils;
  2. import java.time.LocalDateTime;
  3. import java.util.concurrent.ArrayBlockingQueue;
  4. import java.util.concurrent.LinkedBlockingQueue;
  5. import java.util.concurrent.LinkedTransferQueue;
  6. import java.util.concurrent.PriorityBlockingQueue;
  7. /**
  8. * <p>存放队列</p>
  9. *
  10. * @author --
  11. * @since 2024/1/9
  12. */
  13. public class Task01 {
  14.     //有界阻塞队列——FIFO(先进先出)——必须指定大小——数组
  15.     private static final ArrayBlockingQueue<String> QUEUE1 = new ArrayBlockingQueue<>(1);
  16.     //有界阻塞队列——FIFO(先进先出)——默认大小:int最大值——链表
  17.     private static final LinkedBlockingQueue <String> QUEUE2 = new LinkedBlockingQueue<>();
  18.     //无界阻塞队列——FIFO(先进先出)——无限大——链表
  19.     private static final LinkedTransferQueue <String> QUEUE3 = new LinkedTransferQueue<>();
  20.     public static void main(String[] args) throws InterruptedException {
  21.         boolean offer = QUEUE1.offer("1");
  22.         System.out.println("第1次添加:" + offer + "-时间:" + LocalDateTime.now());
  23.         boolean offer1 = QUEUE1.offer("2");
  24.         System.out.println("第2次添加:" + offer1 + "-时间:" + LocalDateTime.now());
  25.         System.out.println(QUEUE1.take());
  26. //        System.out.println(QUEUE1.element());
  27.         System.out.println(QUEUE1.peek());
  28.         System.out.println(QUEUE1);
  29. //        System.out.println(QUEUE1.poll(5, TimeUnit.SECONDS));
  30. //        System.out.println(QUEUE1.poll());
  31. //        System.out.println(QUEUE1.remove());
  32. //        System.out.println(QUEUE1.take());
  33. //        System.out.println(QUEUE1.remove());
  34. //        System.out.println(QUEUE1.remove());
  35. //        System.out.println(QUEUE1.take());
  36. //        System.out.println(QUEUE1.take());
  37. //        System.out.println(QUEUE1.poll());
  38. //        System.out.println(QUEUE1.poll(5, TimeUnit.SECONDS));
  39.         //如队列满:等10秒,然后放弃插入,返回false
  40. //        boolean offer = QUEUE1.offer("1", 10, TimeUnit.SECONDS);
  41. //        System.out.println("第1次添加:" + offer + "-时间:" + LocalDateTime.now());
  42. //        boolean offer1 = QUEUE1.offer("2", 10, TimeUnit.SECONDS);
  43. //        System.out.println("第2次添加:" + offer1 + "-时间:" + LocalDateTime.now());
  44. //
  45. //        System.out.println("添加完成:" + QUEUE1);
  46.         // 如队列满:抛异常
  47. //        boolean add1 = QUEUE1.add("1");
  48. //        System.out.println("第1次添加:" + add1);
  49. //        boolean add2 = QUEUE1.add("2");
  50. //        System.out.println("第2次添加:" + add2);
  51.         //如队列满:一直等
  52. //        QUEUE1.put("1");
  53. //        System.out.println("第1次添加:" + LocalDateTime.now());
  54. //        QUEUE1.put("2");
  55. //        System.out.println("第2次添加:" + LocalDateTime.now());
  56.     }
  57. }
复制代码
三、使用场景、个人理解

1、使用场景


2、个人理解

四、参考:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4