简要介绍
我们知道线程池里面的线程是用来执行一个一个的任务,一个线程一次执行一个任务,执行完后再执行待执行的任务--不包含异常情况如阻塞,被打断等。
假如出现这样一个情况:线程池有2个核心线程,最大4个线程,这时线程池被要求执行10个任务。此时4个线程将其中4个执行,还有6个要存储,存哪?-----阻塞队列!这个时候6个任务就要存到阻塞队列中去。假如此时阻塞队列满了(容量设置为5),还有1个任务咋处理?直接丢弃?抛异常?----这些叫阻塞策略。
本文主要介绍不同阻塞队列的优缺点与阻塞策略的几种情况
阻塞队列
队列,用来存储数据的一种结构
阻塞队列特点:
1)线程安全:阻塞队列是线程安全的,多个线程可以并发访问它而不会发生冲突。
2)当队列为空时,消费者会被阻塞等待直到队列中有元素可供消费;当队列已满时,生产者会被阻塞等待直到队列有空闲位置可供添加元素。
1、Queue接口
Java8 中的Queue接口,是泛型接口,表明你存储的数据类型。
2、BlockingQueue接口
Java8 中的BlockingQueue接口。继承Queue接口,也是泛型接口。
3、BlockingQueue的实现类---具体阻塞队列实现
ArrayBlockingQueue:由数组组成的有界阻塞队列 数组实现,默认大小
LinkedBlockingQueue:由链表组成的有界阻塞队列
LinkedTransferQueue:由链表组成的无界队列
PriorityBlockingQueue:优先级排序的无界阻塞队列
DelayQueue:优先级排序的无界阻塞队列
SynchronousQueue:不存储元素的阻塞队列
LinkedBlockingDeque:由链表组成的双端阻塞队列
原文链接:https://blog.csdn.net/Jiangtagong/article/details/121855261
阻塞策略
多余线程任务如何处理?
(1) CallerRunsPolicy
由提交任务的主线程自己完成,如果完成不了,无法执行后面的任务
(2) AbortPolicy
丢弃任务并抛出异常。这是默认的拒绝策略
(3) DiscardPolicy
丢弃任务,但是不抛出异常
(4) DiscardOldestPolicy
丢弃队列最前面的任务,重新提交给拒绝的任务