【BlockingQueue】BlockingQueue接口方法说明和区别
BlockingQueue在异步处理的时候经常用到它的存放和取出数据的操作,但是如存放也有add、offer等多个方法,这些方法有什么区别,这边用LinkedBlockingQueue作为实现测试一下。
存放
先上方法:
boolean add(E e);boolean offer(E e);void put(E e) throws InterruptedException;boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;
从方法的声明可以看出点端倪,put方法是阻塞的,如果这个队列满了,那么它会一直阻塞等待,直到队列出现空位可以放元素,或者是线程被中断。
至于offer()和add(),看下面的代码:
BlockingQueue queue = new LinkedBlockingQueue(2);
queue.offer(1);
System.out.println(queue.size());
queue.offer(2);
System.out.println(queue.size());
queue.offer(3);
System.out.println(queue.size());
queue.add(4);
System.out.println(queue.size());输出:
1
2
2
Exception in thread "main" java.lang.IllegalStateException: Queue full
可以看出来,offer是一个投资人,就是试一下能不能在队列中放一个元素,尝试的时间可以设定,但是发现不行以后会马上终止,并且返回true或者false。而add是家暴,可以理解为强行加入元素,但是不能加入的时候(比如队列有长度限制并且已经达到长度),直接粗暴的抛出IllegalStateException进行警告。
取出
先上方法
E take() throws InterruptedException;E poll(long timeout, TimeUnit unit)throws InterruptedException;
然后举个例子
BlockingQueue queue = new LinkedBlockingQueue(2);
queue.offer(1);
System.out.println(queue.size());
queue.offer(2);
System.out.println(queue.size());
queue.poll(1, TimeUnit.SECONDS);
System.out.println(queue.size());
queue.poll(1, TimeUnit.SECONDS);
System.out.println(queue.size());
queue.poll(1, TimeUnit.SECONDS);
System.out.println(queue.size());
queue.take();
System.out.println(queue.size());输出:
1
2
1
0
0
(线程一直等待...)
可以看出来,poll方法也是投资人的方式,可以设定时间,然后在无法取出元素的时候果断返回false。而take方法就是一直阻塞等待有元素可以,或者线程被中断。
总结
以上是BlockingQueue中用到的关于存放和取出方法的举例,在LinkedBlockingQueue实现中,还有peek之类的方法,做一个总结放在下面。
方法 | 效果 | 是否阻塞 | 是否抛出异常 | 返回 |
---|---|---|---|---|
boolean add(E e) | 添加 | 否 | 队列满导致添加失败时抛出IllegalStateException | true/false |
boolean offer(E e) | 添加 | 否 | 否 | true/false |
boolean offer(E e, long timeout, TimeUnit unit) | 添加 | 是(指定时间) | 否 | true/false |
void put(E e) | 添加 | 是(无期限) | 阻塞线程中断时抛出InterruptedException | true/false |
E take() | 取出 | 是(无期限) | 阻塞线程中断时抛出InterruptedException | 头部元素 |
E poll(long timeout, TimeUnit unit) | 取出 | 是(指定时间) | 阻塞线程中断时抛出InterruptedException | 头部元素/null |
E remove() | 取出 | 否 | 队列为空时抛出NoSuchElementException | 头部元素 |
E peek() | 查看 | 否 | 否 | 头部元素/null |
E element() | 查看 | 否 | 队列为空时抛出NoSuchElementException | 头部元素 |
【BlockingQueue】BlockingQueue接口方法说明和区别相关推荐
- 抽象类和接口的联系与区别
抽象类和接口联系与区别 关键字: 抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的 ...
- Java中实现接口与继承的区别
** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...
- 面试题:接口和抽象类的区别
区别一,两者表达的概念不一样.抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于"是"的关系:而接口是定义行为规范,因此对于实现接口的子类来说,相对于接 ...
- 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析
作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 ...
- c#接口和抽象类的区别
一.抽象类: 抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆 ...
- Iterator和ListIterator接口的使用和区别
1.Iterator接口 1.1.Iterator接口概述 java.util.Iterator 接口提供遍历任何 Collection 的接口.我们可以从一个 Collection 中使用迭代器方法 ...
- Java 接口和抽象类的区别
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的.接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static f ...
- 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析
转载自 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析 前言 在Spring中使用MyBatis的Mapper接口自动生成时,用一个自定义的注解标记在Mapper接口的方法中,再利用@ ...
- java 关注公众号没有调接口_高频面试题:接口和抽象类的区别
作为一个基础的Java高频面试题,是所有Java面试者必须烂熟于心的.当然不能死记硬背,可以通过实际地写几个小demo,边实际操作边理解,既能感受到编程的快乐,更重要的是真的理解记住了二者的区别. 此 ...
最新文章
- apache ab压力测试
- 万字长文带你了解推荐系统全貌!
- python byte和string转换
- 人工智能不是计算机领域能学么,人工智能的几个热门领域简介及作用
- python——类和对象之私有属性
- 物料主数据(SAP屠夫)
- 函数式接口作为方法的参数【应用】
- ChronicleMap –具有堆外内存的Java体系结构
- 上云难?TA霸气回应:不要你觉得,一键上云 so easy!
- 华为今年不会推出运行鸿蒙OS的手机;Deno 1.3.2发布|极客头条
- JavaScript中call,apply,bind方法
- C++中begin()函数的含参数的使用
- 政务内网、政务外网、政务专网
- 今天有空,不如来找找“双鸭山大学”的由来吧~
- 怎样用excel剔除异常数据_如何剔除异常数据?
- 一键加速GitHub、Pypi、DockerHub访问
- python第三方库bs4库实例之爬取古诗词网上诗歌
- Linux基本功系列之usermod命令实战
- git已经设置了name和email但是还是提示please tell who you are
- 纯函数、柯里化、组合函数的解析以及代码实现
热门文章
- 客户关系维护注意事项 如何维护客户关系
- PTA - 二分查找法
- html测试工具手机版,SP META Tool(手机测试工具)
- OpenCV人脸目标检测、摄像头实时检测
- 微信无法下载文件如何做提示跳转到浏览器
- 真是没想到!原来微信还有这么厉害的翻译功能,一键轻松翻译
- 在华为 Kylin V10 SP1操作系统,HUAWEI,Kunpeng 920 CPU(4Cores)单机上模拟部署生产环境TiDB集群...
- dva的使用,附带一个Demo
- 打开运行PS、AI等软件时卡在启动窗口的解决办法
- 开源WordPress博客主题二次元风-LoliMeow主题