一、队列在线程池中的工作原理及执行顺序
public ThreadPoolExecutor(int corePoolSize, // 维护线程的最小数量
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 允许空闲时间
TimeUnit unit, // 事件单位
BlockingQueue<Runnable> workQueue, // 阻塞队列
ThreadFactory threadFactory,
RejectedExecutionHandler handler) { // 拒绝策略
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
假如队列大小为10,corePoolSize为3,maximumPoolSize为6,当加入20个任务时的执行顺序如下:
——执行corePoolSize的对应大小,即任务1、2、3
——当corePoolSize满了则创建队列,故任务4-13加入队列
——队列已满后,任务14、15、16马上执行,达到maximumPoolSize的值不能再添加任务
——故任务17-20将被抛出异常
——所以最终的执行顺序是:1、2、3、14、15、16、4、5、6、7、8、9、10、11、12、13。
二、队列的分类
队列的特征是先进先出,运算受限的线性表,有队头和队尾
1、一般队列
以上是一般队列的示例图,队头指向第一个元素,队尾指向最后一个元素后的空位置
当队列为空时,front == rear
当出现最后一个图的现象时叫假溢出,队尾后面已满,但队头前面还有空位置,为避免此现象故引入了循环队列~
2、循环队列:头尾相连的存储结构(代码如何实现?)
假设循环队列总容量为N,并且预留一个空的位置作为队列空,满,长度判断标志:
队列空:front == rear;
队列满:(rear+1)%N==front;(此处要求模是因为0和最后一个值交接为头尾时的处理)
队列元素个数:(rear – front + N)%N
3、链式队列:就是线性表的单链表,但只能尾进头出,其增加和删除操作简单
三、队列变形
1、双端队列
Deque是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行,如ArrayDeque和LinkedList
2、优先级队列
优先级队列和通常的栈和队列一样,处理时首先处理优先级最高的。如果两个元素具有相同的优先级,则按照他们插入到队列中的先后顺序处理,如MessageQueue和PriorityQueue
四、leetcode 算法题
621题 任务调度器
641题 设计循环双端队列
933题 最近的请求次数
五、栈:后进先出,运算受限的线性表
1、栈的特性:仅允许在表的一端进行插入和删除运算
2、 栈的存储结构有两种
——顺序结构:通过数组实现
——链式结构:使用链表存储结构
进栈示例:
s.next = stack.top;
stack.top = s;
stack.count ++;
出栈示例:
p = stack.top;
stack.top = p.next;
p.next = null;
stack.count --;
六、面试题:Stack通过Vector实现为不良设计,为什么
如图是Stack的源码继承关系,Stack源码中本身有以下方法:
但继承的Vector.java中也继承了父类AbstractList中的add()方法,此方法可在随意位置添加对象,不符合栈‘仅允许在表的一端进行插入和删除运算’的特性~~~
七、栈的经典应用——逆波兰表达式(用队列和栈实现)
八、栈溢出
StackOverflowError:栈溢出,运算逻辑
——发生情况:比如递归调用,当方法一直压入栈,栈满后将会发生栈溢出
OutOfMemoryError: 堆溢出,存储逻辑