队列
队列有阻塞队列和非阻塞队列。阻塞队列可以阻塞,非阻塞队列不能阻塞,只能使用队列wait(),notify()进行队列消息传送。而阻塞队列当队列里面没有值时,会阻塞直到有值输入。输入也一样,当队列满的时候,会阻塞,直到队列不为空。
补图队列家族、分类、方法汇总
队列是并发编程中的重要管道,是实现生产者线程和消费者线程分离的重要手段,也是线程池的一部分。队列的并发原理如下所示:
非阻塞队列
非阻塞队列的主要方法
add(E e):将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则
会抛出异常;
remove():移除队首元素,若移除成功,则返回true;如果移除失败(队列为空),则会抛出异常;
offer(E e):将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则返回false;
poll():移除并获取队首元素,若成功,则返回队首元素;否则返回null;
peek():获取队首元素,若成功,则返回队首元素;否则返回null
对于非阻塞队列,一般情况下建议使用offer、poll和peek三个方法,不建议使用add和remove方法。因为使用offer、poll和peek三个方法可以通过返回值判断操作成功与否,而使用add和remove方法却不能达到这样的效果。注意,非阻塞队列中的方法都没有进行同步措施。
阻塞队列
阻塞队列主要方法:
抛出异常:
add
、remove
、element
返回结果但不抛出异常:
offer
、poll
、peek
阻塞:
put
、take
阻塞队列包括了非阻塞队列中的大部分方法,其中5个常用的有:
put(E e)
:put方法用来向队尾存入元素,如果队列满,则等待;take()
:take方法用来从队首取元素,如果队列为空,则等待;offer(E e,long timeout, TimeUnit unit)
:offer方法用来向队尾存入元素,如果队列满,则等待一定的时间,当时间期限达到时,如果还没有插入成功,则返回false;否则返回true;poll(long timeout, TimeUnit unit)
:poll方法用来从队首取元素,如果队列空,则等待一定的时间,当时间期限达到时,如果取到,则返回null;否则返回取得的元素;drainTo(Collection)
:将队列中的多个元素转移到指定的集合中,如果队列为空,则不执行任何操作。如果队列中有null,则转移null值;如果指定集合容量不足,则只转移部分;每次调用后原队列元素被移除
阻塞队列大致可以分为这几种:ArrayBlockingQueue,LinkedBlockingQueue,ConcurrentLinkedQueue,DelayQueue,LinkedTransferQueue,SynchronusQueue。
评论区