Java消息队列
来源:互联网 发布:淘宝商家申请 编辑:程序博客网 时间:2024/05/17 11:35
Java并法包消息队列及在开源软件中的使用:
是什么?
BlockingQueue也是java.util.concurrent下主要用来控制线程同步的工具。
为什么?
锁也是用来控制线程同步的,但是锁这个东西有个特点,比如我有一个人抢到一把锁,我去做事,其他人都要等待,然后当我把这把锁释放的瞬间,那些等待的人到底时谁拿到锁,这个没有顺序预测,完全靠运气,拿锁的顺序不可以控制。
怎么办?
我们用消息队列就可以做这个事情,我有一些任务要执行,我就把任务丢到队列里面去,有一个线程拿走一个任务,那么下一个线程拿走一定是下一个任务,所以我们的任务时可以按顺序执行。
两种阻塞可能:
①消息队列是同步阻塞,就是我往里面放东西的时候,别人就不能放;我从里面取东西的时候,别人就不能取。(着重点:在放或取的那一刻,相当于对消息队列加了同步锁)
②我的Queue(消息队列)满的时候,就不能在push了,要等别人从队列里把东西取走。其实消息都列对阻塞存取也可以,对非阻塞存取也可以。(着重点:在Queue(消息队列)满的时候,即不能在插入的时候,这个时候,是可以由用户决定是阻塞等待空间,还是继续执行其他操作)
主要方法:
put、take 一对阻塞存取(即当队列为空的时候或满的时候,会等待空间)
add、poll(time) 一对非阻塞存取(即当队列满的时候,抛出异常并且该线程中断;当队列为空的时候,可以等待规定时间内,仍取不到数后停止等待,继续执行带线程后面的操作)
插入:
1、add(anObject):把anObject加到BlockingQueue里面,即BlockingQueue可以容纳就返回true,否则抛出异常。
2、offer(anObject):把anObject加到BlockingQueue里面,即BlockingQueue可以容纳就返回true,否则返回false。
3、put(anObject):把anObject加到BlockingQueue里面,如果BlockingQueue没有空间,则等待,直到BlockingQueue有空间再继续。
读取:
1、poll(time):取走BlockingQueue队首的对象,如果不能立即取出,则等待time参数规定时间,再取不走时返回null。
2、take():取走BlockingQueue队首的对象,若BlockingQueue为空,则阻塞,一直等到拿到东西才走。
其他:
1、int remainingCapacity():返回队列剩余容量,如果正好有数据再插入或者取出的时候,这个数据就可能不准。
2、boolean remove(Object o):从队列里面移除元素,如果存在,即移除一个或者多个。队列改变了返回true。
3、public boolean contain(Object o):查看队列是否存在这个元素,存在返回true。
4、int drainTo(Collection<? supper E> c):移除队列里面所有可用的元素,并将他们添加到collection中。
5、int drainTo(Collection<? supper E> c, int maxElements):规定了移除的最大maxElements个元素。
BlockingQueue有四个具体的实现类,常用的有:
ArrayBlockingQueue:是基于一个数组,再构造的时候传入一个int,确定数组的大小。
LinkedBlockingQueue:构造的时候不传int的时候,默认有Integer.MAX_VALUE那么大。
- java中的消息队列
- java消息队列
- Java消息队列
- java中的消息队列
- java消息队列
- java 消息队列学习
- java 消息队列
- java zmq消息队列
- 【java】消息队列
- java 技术:消息队列
- java消息队列理解
- Java消息队列--ActiveMq
- java多线程:消息队列
- java消息队列
- Java消息队列
- java多线程消费消息队列
- java消息队列使用场景
- java消息队列使用场景
- python脚本学习(2)
- C# 类与类之间的嵌套,声明时子类对象为空的问题
- [ARC084]E
- sql语句实现多条数据合为一条数据
- Android----OKHttp网络请求-拦截器
- Java消息队列
- matplotlib基础
- 20171206
- php+apache+yaf框架开发环境搭建
- 软件光栅化渲染器一
- Spring 获取方法参数名
- Agri-Net POJ
- UML总结(一)----学习主要重点概述
- 系统调用和库函数及API的区别