典型回答

✅什么是线程池,如何实现的?

这个问题其实在上面的文章中介绍过,但是我发现最近问这个还挺多的, 有的时候搜索不一定能找到准确的内容,所以单独写一篇,详细展开再介绍下。

以下这个是Java中ThreadPoolExecutor的构造函数,那么看他都有哪些参数就行了。

参数含义说明
corePoolSize核心线程数核心线程会一直存在(即使空闲),除非设置了 allowCoreThreadTimeOut(true)。当任务到来时,线程池先创建核心线程来执行任务。

可以类比正式员工数量,常驻。
maximumPoolSize最大线程数线程池中允许存在的最大线程数。任务太多且队列已满时,会创建非核心线程,直到达到此上限。

公司最多雇佣员工数量。
workQueue任务队列存放等待执行任务的队列。不同类型的队列影响线程池的行为。

再多的人都处理不过来了,需要等着,在这个地方等。
keepAliveTime非核心线程存活时间超过核心线程数的空闲线程,超过该时间后会被销毁。

就是外包人员等了多久,如果还没有活干,解雇了。
unit时间单位TimeUnit.SECONDS, MILLISECONDS等,表示 keepAliveTime的单位。
threadFactory线程工厂用于创建线程,一般用于给线程命名或设置为守护线程。
handler拒绝策略当任务太多无法处理时的处理方式(如抛异常、丢弃、调用者执行等)。

线程池创建方法

✅为什么不建议通过Executors构建线程池

核心线程数&最大线程数

✅线程数设定成多少更合适?

拒绝策略

✅线程池的拒绝策略有哪些?

任务队列类型

队列类型说明特点
LinkedBlockingQueue无界链表队列(默认容量 Integer.MAX_VALUE
常用于执行大量任务,容易导致 OOM。
ArrayBlockingQueue有界数组队列可限制任务数量,防止 OOM,推荐使用。
SynchronousQueue不存储任务的“直接移交”队列每个插入操作必须等待对应的取出操作。用于“任务即时执行”。
PriorityBlockingQueue优先级队列根据任务优先级执行。

线程池调优

✅如何进行线程池调优?