提纲:

基础八股知识🔥

  • 参数

    • corePoolSize

    • maximumPoolSize

    • keepAliveTime

    • BlockingQueue

    • TimeUnit

    • ThreadFactory

    • handler

  • 获取方式

  • 工作原理

  • 优点

  • 使用场景

面试八股真题🎈

  • 1、常用的线程池有哪些

  • 2、简述一下你对线程池的理解

  • 3、线程池核心线程数怎么设置

  • 4、Java线程池中队列常用类型有哪些

  • 5、线程安全需要保证几个基本特征

  • 6、线程池原理知道吗?以及核心参数

  • 7、线程池的拒绝策略有哪些

一、基础八股知识点

1. 参数

  • corePoolSize:

    • 核心线程数,即工作线程数

  • maximumPoolSize:

    • 最大线程数,最大线程数 - 核心线程数 = 救急线程数

  • keepAliveTime:

    • 救急线程的存活时间

  • BlockingQueue:

    • 阻塞队列,用来存放任务对象

    • 种类:

      • ArrayBlockingQueue:数组实现的阻塞队列,有存储上限

      • LinkedBlockingQueue:双向链表实现的阻塞队列,没有容量上限

      • SychronizedBlockingQueue:特殊的阻塞队列,容量为 0,即一个生产者想放入任务时,必须有一个消费者可以取

      • PriorityBlockingQueue:优先级等待队列,根据任务的优先级大小排序,每次取出堆顶的任务,没有容量限制

  • TimeUnit:

    • 存活时间的单位

  • ThreadFactory:

    • 用来创建工作线程

  • handler:拒绝策略

    • 默认为抛出异常,并丢弃该任务

    • 交还给生产者线程自己执行

    • 替换阻塞队列中队头的任务

    • 直接丢弃该任务

2.获取方式

  • 使用 ThreadPoolExcutor 自己传入参数获取一个标准的线程池

  • 使用 Excutors 获取特定功能的线程池,如 ScheduledThreadPool 提供延时和定时执行功能的线程池

3.工作原理

  • 生产者线程调用 excute 方法传入 Runable 的对象提交任务

  • 线程池收到任务对象,判断当前工作线程数是否小于核心线程数,若小于,创建工作线程并执行,工作线程会不断从阻塞队列中获取任务进行执行

  • 若工作线程已经达到核心线程数,将任务放入阻塞队列

  • 若阻塞队列使用的 ArrayBlockingQueue,会有存储上限,若达到存储上限,判断当前线程数是否大于最大线程数,若不大于,创建救急线程处理任务

  • 救急线程处理完任务后,若没有到达销毁救急线程的时间,就会不断从阻塞队列中获取任务并执行

  • 若当前线程数到达最大线程数,即救急线程也不够用了,就调用