Java并发编程是大厂第一轮面试中的高频面试题,而线程池又是其中的典型代表,本文将梳理关于线程池的工作机制,并提出灵魂之问:你对线程池的工作机制这么了解,那你在工作中是如何判断一个线程池需要创建多少个线程的呢?
1、线程池基本工作原理与面试指南
1.1 java线程池的核心属性
JAVA 线程池的核心属性如下:
- int corePoolSize 核心线程数
- int maximumPoolSize 线程池最大线程数
- long keepAliveTime 线程保持活跃的时间
- TimeUnit unit keepAliveTime 的时间单位
- BlockingQueue< Runnable > workQueue 任务挤压队列
- ThreadFactory threadFactory 线程创建工厂类
- RejectedExecutionHandler handler 拒绝策略
1.2 向线程池提交任务时线程创建过程
那当用户向线程池提交一个任务的时候,线程池会如何创建线程呢?
- 首先线程池会判断当前已创建的线程是否小于 corePoolSize (核心线程数),如果小于,则无论已创建的线程是否空闲,都会选择创建一个新的线程来执行该任务,直到已创建的线程等于核心线程数。
- 当线程池中已创建的线程数等于核心核心线程数时,用户继续向线程池提交任务时,此时会先判断任务队列是否已满: 1)如果任务队列未满,则将任务放入队列中。 2)如果任务队列已满,则判断当前线程数量是否超过了最大线程数量,如果未超过,则创建一个新的线程来执行该任务,如果线程池已创建的线程数量等最大线程数,则执行拒绝策略。
量。
那我们怎么判断需要增加更多线程呢? 其实可以用jstack命令查看一下进程的线程栈,如果发现线程池中大部分线程都处于等待获取任务,则说明线程够用,如下图所示:
如果大部分线程都处于运行状态,可以继续适当调高线程数量。