题目:什么是线程池,如何实现的?
难度:low
标签:java/threadpool, general/knowledge
评分:⭐⭐⭐☆☆(3/5)
线程池从字面上它是线程的存储池,它是一种池化技术。池化技术本身核心的目的就是对相对耗资源或者建立耗资源的数据资源资源物进行一个缓存,达到重复利用利用资源的目的。线程池的实现本身它是把一些线程先创建出来,然后给,在你使用线程的时候直接从池内获取,达到不让你每次去建立一个新线程的目的。然后这个线程使用了之后,你再把这个线程退回给线程池,后续其他的主线程在使用的时候再从线程池里拿。最终实现线程的复用。然后线程池这以 Java 为主去说吧。Java 的线程池主要定义了几个核心参数。首先是核心线程数,也就是最初这个线程池内会保留常驻的线程会有多少。基本上在你创建了请求过来之后,它就会从常驻的核心线程里边拿数据。然后其次它有最大线程,最大的线程数,也就是说这个线程,线程池,当线程任务比较多的时候,会最大扩展,扩展到多少个线程。当扩展到这个线程之后,是不会再去继续扩展的了,这也就是最大线程数。然后是另外的核心参数,就是任务队列。这个是当你请求的任务线程,核心线程已经占用满了之后,有多少任务存留下来。暂缓放到队列里边,然后等核心线程处理完其他的事务之后,再去从任务队列里拿,然后进行一个交替地去获取任务去执行的一个过程。然后这个过程中需要使用任务队列,这个任务队列就是这个一个核心参数,它里边存放着一些要处理的任务。当任务队列满了之后,才开始扩展非核心线程,去使用后续的那个最大线程数去扩展线程,非核心线程。然后另外的就是拒绝策略,比较核心的拒绝策略,这个拒绝策略主要应对的目的就是,当线程池实在处理不了你这个线程了,实在处理不了你的任务的时候,以什么方式去给你反馈。常见的是直抛异常,就是你你给我发任务,我处理不了了,我就抛一个异常给你,你自己想办法处理,告诉你出问题了。还有就是吞掉,什么都不处理,直接就过掉,把这个任务放弃。另外是可以自定义,还有就是把这个任务放给当前调用的主线程去处理,它自己处理,我不处理。基本上就这些。
优点:
不足:
keepAliveTime(非核心线程存活时间)和 threadFactory(线程工厂,用于线程命名,排查问题必备)AbortPolicy、DiscardPolicy、DiscardOldestPolicy、CallerRunsPolicyArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueueallowCoreThreadTimeOut、线程池 5 态、Executors 禁用原因补充:
最后更新:2026-10-26 · 基于第 3 次作答
结论:线程池 = 池化 + 限流 + 隔离;7 大参数 + 三步执行流程(core → 队列 → max → 拒绝)是核心。 关键词:7 大参数 · core→队列→max→拒绝 · Executors 禁用 边界:队列优先级高于 max 扩容;无界队列 OOM;CallerRunsPolicy 天然限流
核心考点定位:能否说清 ThreadPoolExecutor 的参数体系、执行流程、工程选型。
机制链(3 环):
证据锚点(去重 ≥6):
对比与权衡:
| 队列类型 | 有界 | 阻塞特性 | 适用场景 |
|---|---|---|---|
| ArrayBlockingQueue | ✅ | 有界 FIFO | IO 密集,控内存 |
| LinkedBlockingQueue | 可无界 | 默认无界 | ❌ OOM 风险 |
| SynchronousQueue | ❌ | 不存储 | CPU 密集 |
| PriorityBlockingQueue | 无界 | 按优先级 | 任务有优先级 |
权衡:队列选择要平衡吞吐(有界防 OOM)与延迟(SynchronousQueue 直接传递),生产环境建议 ArrayBlockingQueue 有界 + CallerRunsPolicy 限流。
常见误区:
适用边界:
【结论】 线程池本质是池化思想,核心目标是复用线程 + 限流 + 隔离。
【三点】
第一,7 大参数:corePoolSize 常驻线程数、maximumPoolSize 最大线程数、keepAliveTime 非核心线程空闲回收时间、unit 时间单位、workQueue 阻塞队列、threadFactory 线程工厂(一定要给线程命名,方便排查)、handler 拒绝策略。
第二,执行流程:任务进来先看当前线程数是否小于 core,是就建核心线程;否则看队列是否满,不满入队;否则看是否小于 max,是就建非核心线程;都不行触发拒绝策略。注意队列优先级高于 max 扩容,这是很多人讲错的地方。
第三,拒绝策略 4 种内置:AbortPolicy 抛异常(默认)、DiscardPolicy 静默丢弃、DiscardOldestPolicy 丢队列头重试、CallerRunsPolicy 调用者自己执行——这个我比较常用,天然限流让上游感受慢。
【边界】 队列选择看场景:CPU 密集用 SynchronousQueue 或无队列,max 拉高;IO 密集用 ArrayBlockingQueue 有界队列控内存;任务有优先级用 PriorityBlockingQueue。生产禁用 Executors,因为它内部用无界队列或无上限线程,容易 OOM。参数估算用 N_cpu × 2(IO 密集)做初值,再压测调优。