Java消息队列

来源:互联网 发布:淘宝商家申请 编辑:程序博客网 时间:2024/05/17 11:35

Java并法包消息队列及在开源软件中的使用:

是什么?

BlockingQueue也是java.util.concurrent下主要用来控制线程同步的工具。

为什么?

锁也是用来控制线程同步的,但是锁这个东西有个特点,比如我有一个人抢到一把锁,我去做事,其他人都要等待,然后当我把这把锁释放的瞬间,那些等待的人到底时谁拿到锁,这个没有顺序预测,完全靠运气,拿锁的顺序不可以控制。

怎么办?

我们用消息队列就可以做这个事情,我有一些任务要执行,我就把任务丢到队列里面去,有一个线程拿走一个任务,那么下一个线程拿走一定是下一个任务,所以我们的任务时可以按顺序执行。

 

 

两种阻塞可能:

①消息队列是同步阻塞,就是我往里面放东西的时候,别人就不能放;我从里面取东西的时候,别人就不能取。(着重点:在放或取的那一刻,相当于对消息队列加了同步锁)

 

我的Queue(消息队列)满的时候,就不能在push了,要等别人从队列里把东西取走。其实消息都列对阻塞存取也可以,对非阻塞存取也可以。(着重点:Queue(消息队列)满的时候,即不能在插入的时候,这个时候,是可以由用户决定是阻塞等待空间,还是继续执行其他操作)

主要方法:

puttake                一对阻塞存取(即当队列为空的时候或满的时候,会等待空间)

addpoll(time)    一对非阻塞存取(即当队列满的时候,抛出异常并且该线程中断;当队列为空的时候,可以等待规定时间内,仍取不到数后停止等待,继续执行带线程后面的操作)

 

插入:

     1add(anObject):anObject加到BlockingQueue里面,即BlockingQueue可以容纳就返回true,否则抛出异常。

     2offer(anObject):anObject加到BlockingQueue里面,即BlockingQueue可以容纳就返回true,否则返回false

     3put(anObject):anObject加到BlockingQueue里面,如果BlockingQueue没有空间,则等待,直到BlockingQueue有空间再继续。

 

读取:

     1poll(time):取走BlockingQueue队首的对象,如果不能立即取出,则等待time参数规定时间,再取不走时返回null

     2take():取走BlockingQueue队首的对象,BlockingQueue为空,则阻塞,一直等到拿到东西才走。

 

其他:

     1int remainingCapacity():返回队列剩余容量,如果正好有数据再插入或者取出的时候,这个数据就可能不准。

     2boolean remove(Object o):从队列里面移除元素,如果存在,即移除一个或者多个。队列改变了返回true

     3public boolean contain(Object o):查看队列是否存在这个元素,存在返回true

     4int drainTo(Collection<? supper E> c):移除队列里面所有可用的元素,并将他们添加到collection中。

     5int drainTo(Collection<? supper E> c, int maxElements):规定了移除的最大maxElements个元素。

 

BlockingQueue有四个具体的实现类,常用的有:

ArrayBlockingQueue:是基于一个数组,再构造的时候传入一个int,确定数组的大小。

 

LinkedBlockingQueue:构造的时候不传int的时候,默认有Integer.MAX_VALUE那么大。

原创粉丝点击