阻塞队列实际上就是个队列,只不过当队列里面东西是空的时候,当从队列中拿数据的时候会阻塞,当队列满了的时候,向队列中添加元素也会阻塞。当我不断取元素直到队列里的元素为空,会自动挂起线程,当我队列里面突然有元素了,会自动唤醒取元素的线程。这个阻塞队列的好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都一手给我包办了。
2.1ArrayBlockingQueue
基于数组的阻塞队列实现,在其内部维护了一个定长的数组,以便存储缓存的对象,同时它里面还维护了两个整型变量,分别标识着队列的头部和尾部在数组中的位置。它在生产者放入数据和消费者获取数据,都是同时共用一个锁对象,由此意味着两者无法真正的并行。
2.2LinkedBlockingQueue
基于链表的阻塞队列,内部也维持了一个数据缓冲队列(该队列有一个链表组成),与ArrayBlockingQueue不同的是这个的最大容量是Integer.MAX_VALUE。而且他对于生产者和消费者端分别采用了独立的锁来控制同步,这意味着在高并发情况下生产者和消费者可以并行地操作队列中的数据。
2.3 DelayQueue
DelayQueue中的元素只有当其指定的延迟时间到了,才能够从队列中获取到元素,他没有大小限制因此生产者永远不会阻塞。而且使用优先级队列实现延迟。
2.4PriorityBlockingQueue
他是一个支持优先级排序的无界阻塞序列,他也不会阻塞生产者,只会阻塞消费者,但是生产者生产的速度绝对不会快于消费者消费的速度,否则时间一长,会最终耗尽所有可用的堆空间。
2.5SynchronousQueue
一种无缓冲的等待队列,类似于无中介的直接交易,生产者生产好了之后必须得等消费者消费,如果没有消费者消费他就会一直等待,对于消费者来说也是这样。
2.6LinkedTransferQueue
LinkedTransferQueue是一个由链表构成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。LinkedTransferQueue采用一种预占模式。
- 队列不为空,直接取走数据
- 队列为空,那就生成一个节点元素为null的入队,然后消费者线程在这等待
- 如果生产者线程发现有一个null节点在队列上,生产者线程就不入队了直接将元素填充到该节点,并唤醒消费者线程取走元素,从调用的方法返回。
2.7LinkedBlockingDeque
LinkedBlockingDeque是一个由链表组成的双向阻塞队列,即可以从队列的两端插入和移除元素。还有一个特点就是可以设置超时时间参数,超时后返回false表示操作失败,也可以不设置超时参数一直阻塞,中断之后抛出InterruptedException异常。读元素时同样可以设置超时参数。
到此这篇阻塞队列最多有几个方法(阻塞队列最多有几个方法控制)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/66745.html