目 录CONTENT

文章目录

队列

FatFish1
2024-10-24 / 0 评论 / 0 点赞 / 42 阅读 / 0 字 / 正在检测是否收录...

队列

队列有阻塞队列和非阻塞队列。阻塞队列可以阻塞,非阻塞队列不能阻塞,只能使用队列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方法却不能达到这样的效果。注意,非阻塞队列中的方法都没有进行同步措施。

阻塞队列

阻塞队列主要方法:

  • 抛出异常:addremoveelement

  • 返回结果但不抛出异常:offerpollpeek

  • 阻塞:puttake

阻塞队列包括了非阻塞队列中的大部分方法,其中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。

0

评论区