若图片有问题,请点击此处查看
很久前(2020-10-23),就有想法学习线程池并输出博客,但是写着写着感觉看不懂了,就不了了之了。现在重拾起,重新写一下(学习一下)。
线程池的优点也是老生常谈的东西了
- 减少线程创建的开销(任务数大于线程数时)
- 统一管理一系列的线程(资源)
??子标题
若图片有问题,请点击此处查看
很久前(2020-10-23),就有想法学习线程池并输出博客,但是写着写着感觉看不懂了,就不了了之了。现在重拾起,重新写一下(学习一下)。
线程池的优点也是老生常谈的东西了
若图片有问题,请点击此处查看
本文讲PriorityBlockingQueue(优先阻塞队列)
一个无界的具有优先级的阻塞队列,使用跟PriorityQueue相同的顺序规则,默认顺序是自然顺序(从小到大)。若传入的对象,不支持比较将报错( ClassCastException)。不允许null。 底层使用的是基于数组的平衡二叉树堆实现(它的优先级的实现)。 公共方法使用单锁ReetrantLock保证线程的安全性。
若图片有问题,请点击此处查看
本文讲ArrayBlockingQueue
一个基于数组的有界阻塞队列,FIFO顺序。支持等待消费者和生产者线程的可选公平策略(默认是非公平的)。公平的话通常会降低吞吐量,但是可以减少可变性并避免之前被阻塞的线程饥饿。
若图片有问题,请点击此处查看
本文介绍LinkedBlockingQueue,这个队列在线程池中常用到。(请结合源码,看本文)
LinkedBlockingQueue, 不支持null,基于单向链表的可选有界阻塞队列。队列的顺序是FIFO。基于链表的队列通常比基于数组的队列有更高的吞吐量, 但在大多数的并发应用中具有更低的可预测性能较差(这句话,在最后解释一下) 如果不选择队列的容量,默认值是Integer.MAX_VALUE,为了防止队列的过度扩张. 还实现了Collection接口与Iterator接口中所有的可选方法。
若图片有问题,请点击此处查看
如标题所见,我在使用IDEA debug ConcurrentLinkedQueue的Offer方法时,发生了下面的情况。
代码如下:
1 |
|