简要介绍

我们知道线程池里面的线程是用来执行一个一个的任务,一个线程一次执行一个任务,执行完后再执行待执行的任务--不包含异常情况如阻塞,被打断等。

阻塞队列!这个时候6个任务就要存到阻塞队列中去。假如此时阻塞队列满了(容量设置为5),还有1个任务咋处理?直接丢弃?抛异常?----这些叫阻塞策略

本文主要介绍不同阻塞队列的优缺点阻塞策略的几种情况

阻塞队列

队列,用来存储数据的一种结构

阻塞队列特点:

1)线程安全:阻塞队列是线程安全的,多个线程可以并发访问它而不会发生冲突。

2)当队列为空时,消费者会被阻塞等待直到队列中有元素可供消费;当队列已满时,生产者会被阻塞等待直到队列有空闲位置可供添加元素。

1、Queue接口

Java8 中的Queue接口,是泛型接口,表明你存储的数据类型。

java线程池中的队列剩余值怎么算_java线程池中的队列剩余值怎么算

2、BlockingQueue接口

Java8 中的BlockingQueue接口。继承Queue接口,也是泛型接口。

java线程池中的队列剩余值怎么算_数据结构_02

3、BlockingQueue的实现类---具体阻塞队列实现

ArrayBlockingQueue:由数组组成的有界阻塞队列  数组实现,默认大小
 LinkedBlockingQueue:由链表组成的有界阻塞队列
 LinkedTransferQueue:由链表组成的无界队列
 PriorityBlockingQueue:优先级排序的无界阻塞队列
 DelayQueue:优先级排序的无界阻塞队列
 SynchronousQueue:不存储元素的阻塞队列
 LinkedBlockingDeque:由链表组成的双端阻塞队列

阻塞策略

多余线程任务如何处理?

(1) CallerRunsPolicy
由提交任务的主线程自己完成,如果完成不了,无法执行后面的任务

(2) AbortPolicy
丢弃任务并抛出异常。这是默认的拒绝策略

(3) DiscardPolicy
丢弃任务,但是不抛出异常

(4) DiscardOldestPolicy
丢弃队列最前面的任务,重新提交给拒绝的任务