什么是队列queue
?
先进先出表,是一种受限制的线性表.其限制是仅允许在表的队尾进行插入数据和表的队头进行删除数据.
队列的使用场景: 线程池ThreadPoolExecutor
ThreadPoolExecutor
源码中核心变量(前面3个是重点)
corePoolSize
线程池维护的最小线程数量,哪怕是空闲的BlockQueue<Runnable> workQueue
阻塞队列maximumPoolSize
线程池维护的最大线程数量ReentrantLock mainLock
互斥锁HashSet<Worker> workers
线程集合,一个Worker对应一个线程Condition termination
终止条件largestPoolSize
线程池中线程数量曾经达到过的最大值completedTaskCount
已完成任务数量ThreadFactory threadFactory
ThreadFactory对象,用于创建线程RejectedExecutionHandler handler
拒绝策略的处理句柄keepAliveTime
线程池维护线程所允许的空闲时间allowCoreThreadTimeOut
ThreadPoolExecutor
执行流程图如下:
扩展知识:
- 队列假溢出、循环队列、双端队列(概念: 插入和删除操作在表的两端进行. 例如:
LinkedList
ArrayQueue
RedisQueue
)、优先级队列(概念: 队列中每个元素都有一个优先级. 例如:MessageQueue
)
栈stack
后进先出表,是一种受限制的线性表.其限制是仅允许在表的栈顶进行插入和删除数据.
方法:
- push(E item) 新增
- pop() 删除
- peek() 查询栈顶元素
- empty() 栈的非空判断
- search(Object o) 查询元素在栈中的索引
栈的面试题
Java
中的栈Stack
是通过Vector
来实现的,这种设计被认为是不良的设计,说说你的看法?
因为Vector中可以在指定位置index添加和删除元素,而栈stack的特性是只能在栈顶添加和删除元素,所以Stack继承自Vector有些不符.
栈的经典应用-逆波兰表达式法
JVM虚拟机
Java编译器和操作系统平台之间的虚拟处理器
StackOverFlowError
出现的情况,递归调用造成的死循环
OutOfMemoryError
创建的对象占用内存超过了我们设备的内存大小时报这个错
拓展知识:
JVM栈的每一个栈帧(slot)大小都是4bytes(4字节),一个对象的引用刚好占一个栈帧4字节