赞
踩
是什么?
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那么大。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。