blocking queue有三种加入队列的方法,分别为add(), put(), offer(),那么这三个方法有什么区别,我们可以写一段代码来验证一下

public static void main(String[] args) throws InterruptedException {LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue<>(1);linkedBlockingQueue.add("1");try {linkedBlockingQueue.add("test add");} catch (Exception e) {System.out.println("------------------------");System.out.println("test add method: ");e.printStackTrace();System.out.println("------------------------");}boolean offer = linkedBlockingQueue.offer("test offer");System.out.println("test offer method: ");System.out.println(offer);System.out.println("------------------------");System.out.println("test put method: ");System.out.println("start: " + new Date());ExecutorService executorService = Executors.newSingleThreadExecutor();executorService.execute(() -> {try {Thread.sleep(1000);linkedBlockingQueue.take();} catch (InterruptedException e) {e.printStackTrace();}});linkedBlockingQueue.put("test put");System.out.println("end:   " + new Date());System.out.println("------------------------");}

结果如下:

------------------------
test add method:
java.lang.IllegalStateException: Queue fullat java.util.AbstractQueue.add(AbstractQueue.java:98)at com.main.MainTest.main(MainTest.java:15)
------------------------
test offer method:
false
------------------------
test put method:
start: Mon Jun 22 19:05:14 CST 2020
end:   Mon Jun 22 19:05:15 CST 2020
------------------------

代码模拟的是队列总大小为1的情况,并且队列里已经有一个数据,此时往里面添加元素。从结果可以看出,使用add方法时如果队列已满,会直接抛异常,不会阻塞,而且从jdk源码可以看出来add方法底层实际上调用了offer方法,使用offer方法时,队列满时会返回false,offer还有一个带时间的方法,可以等待一定时间再添加元素,可以认为不是阻塞的,put方法添加元素时从结果时间上可以看出是有阻塞的,可以调大睡眠时间,观察的直观。

所以最终add()和offer()方法不会阻塞,put方法会阻塞

从队列里面删除元素同样有两种方法,poll()和take(),poll不会阻塞,如果没有拿到就返回null,take方法会阻塞直到有数据返回

Blocking Queue三种加入队列方法对比相关推荐

  1. iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

  2. OpenCV函数应用:基于二值图像的三种孔洞填充方法记录(附python,C++代码)

    系列文章目录 函数系列: OpenCV函数简记_第一章数字图像的基本概念(邻域,连通,色彩空间) OpenCV函数简记_第二章数字图像的基本操作(图像读写,图像像素获取,图像ROI获取,图像混合,图形 ...

  3. Unity三种物体溶解方法

    Unity三种物体溶解方法 @[TOC](Unity三种物体溶解方法 效果展示 1. 利用Noise纹理进行溶解 shader要点 shader代码 2. 屏幕空间棋盘格 shader要点 shade ...

  4. ETL常用的三种工具介绍及对比 Datastage,Informatica 和 Kettle

    大家好,我是梦想家 Alex ~ ETL是数据仓库中的非常重要的一环,是承前启后的必要的一步.ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最 ...

  5. 几种梯度下降方法对比(Batch gradient descent、Mini-batch gradient descent 和 stochastic gradient descent)

    几种梯度下降方法对比(Batch gradient descent.Mini-batch gradient descent 和 stochastic gradient descent) 我们在训练神经 ...

  6. 详解C#实例化对象的三种方式及性能对比

    前言 做项目过程中有个需求要实例化两万个对象并添加到List 中,这个过程大概需要1min才能加载完(传参较多),于是开启了代码优化之旅,再此记录. 首先想到的是可能实例化比较耗时,于是开始对每种实例 ...

  7. 【小白学习keras教程】十、三种Model Selection方法:k-fold cross-validation,GridSearchCV和RandomizedSearchCV

    @Author:Runsen Model Selection是划分训练集和测试集的手段,下面总结了三种Model Selection方法. k-fold cross-validation using ...

  8. Python实现二叉树的三种深度遍历方法!

    python代码实现了二叉树,这次将会实现二叉树的几种遍历方法,来更好的解析二叉树的结构特点.分别是一种广度遍历,和三种深度遍历方法:先序遍历,中序遍历,后序遍历.下面是代码实现: 1.先序遍历 遍历 ...

  9. php调用mysql库_PHP调用三种数据库的方法(1)

    PHP调用三种数据库的方法(1) 更新时间:2006年10月09日 00:00:00   作者: MySQL是一个小巧灵珑的数据库服务器软件,对于中.小型应用系统是非常理想的.除了支持标准的ANSI ...

  10. 实现两数 交换的三种不同编程方法。

    第一种 即常规方法 借助第三变量 int a = 5,b = 3,c; c = a; a = b; b = c; 第二种 不借助第三变量 int a=5,b=3,c; a = a+b;    //(缺 ...

最新文章

  1. 采用矩阵+深度优先算法解决迷宫问题
  2. 删除千万级表中重复记录的办法
  3. MaskedTextBox
  4. 可怕的乖孩子_小说《可怕的乖孩子》讲了一个什么故事?
  5. 打不开开php_(13)10个开源免费的PHP博客CMS
  6. linux启动php服务_群晖docker 实现nodejs为后端的简单web服务器 并连接数据库
  7. STM32工作笔记0068---SPI同步通信Flash读写实验
  8. HTTP Status 404 - There is no Action mapped for...
  9. Python脚本控制的WebDriver 常用操作 十八 获取测试对象的css属性
  10. a标签提交form表单_Web前端开发基础知识,HTML中表单元素的理解
  11. 哨兵系列卫星介绍与下载教程
  12. 什么是Service(服务)?
  13. UV (网站独立访客)
  14. 关于Facebook的28件小事
  15. HDU-魔咒词典(字符串hash)
  16. 一次微信小程序的问题跟踪记录
  17. Android 新版个税计算小demo程序
  18. urlencode、unquote
  19. Web前端优化最佳实践
  20. WPF实现Aero毛玻璃效果

热门文章

  1. 基于STM32的AT24C08数据读写
  2. 算法音乐往事:二次元女神“初音未来”诞生记
  3. 软件测试项目实战经验附视频以及源码【商城项目,app项目,电商项目,银行项目,医药项目,金融项目】
  4. 软件测试 | App测试——Appium实战总结,淘宝App测试项目案例
  5. mysql 批量 插入或更新
  6. MySQL 批量插入申请自增 ID
  7. Virtualbox主机与虚拟机相互访问
  8. SQL行列转换-sum函数的妙用
  9. sr里简体中文的代码_各国语言代码大全Locale ID (LCID)表
  10. 【golang】golang获取客户端ip