搞定Java大厂项目面试 轻松打动面试官
-------------------------------------------
下栽地止:https://www.itwangzi.cn/2382.html
-------------------------------------------
搞定Java大厂项目面试 轻松打动面试官
Java线程池概念
顾名思义,管理线程的池与手动创建和运行线程相比,使用线程池有以下优点
减少线程创建和线程销毁带来的开销
提高反应能力。 当任务到来时,相比手动创建线程,直接从线程池获取线程肯定要快很多
提高线程的可管理性。 线程是一种稀缺资源。 如果无限制地创建,不仅会消耗系统资源,还会降低系统稳定性。 线程池可用于统一分配、调优和监控
Java线程池的创建
无论创建什么类型的线程池(FixedThreadPool、CachedThreadPool...),都会调用ThreadPoolExecutor构造函数。 下面详细解释一下各个参数的作用
corePoolSize:最大核心线程数,一般来说就是线程池常驻线程的最大数量
MaximumPoolSize:线程池中运行的最大线程数(包括核心线程和非核心线程)
keepAliveTime:线程池中空闲线程(仅针对非核心线程)可以存活的最大时间
unit:生存时间单位,与keepAliveTime一起使用
workQueue:阻塞队列,用于存储任务
判断线程池中核心线程数量是否达到阈值corePoolSize,如果没有,则创建新的核心线程来执行任务
如果核心线程数已达到阈值corePoolSize,判断阻塞队列workQueue是否已满,如果未满,则向阻塞队列添加新任务
如果已满,则判断线程池中的线程数是否达到阈值maximumPoolSize,如果没有,则创建新的非核心线程来执行任务。 如果达到阈值,则执行线程池饱和策略。
线程池饱和策略分为以下几种:
AbortPolicy:直接抛出异常,默认策略
DiscardPolicy:直接丢弃任务
DiscardOldestPolicy:丢弃下一个要执行的任务(最旧的任务)
CallerRunsPolicy:在主线程中执行任务
几种常用的线程池
几种典型的工作队列
ArrayBlockingQueue:使用数组实现的有界阻塞队列,具有先进先出的特点
LinkedBlockingQueue:使用链表实现的阻塞队列。 其特点是先进先出,容量可设定。 默认为Interger.MAX_VALUE,特点是先进先出
PriorityBlockingQueue:使用平衡二叉树堆实现的优先级无界阻塞队列
举报/反馈