搞定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:使用平衡二叉树堆实现的优先级无界阻塞队列

  举报/反馈