Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions 02-java/concurrency/手动创建线程池,效果会更好哦.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,30 @@
private ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-call-runner-%d").build();
private ExecutorService taskExe = new ThreadPoolExecutor(10,20,200L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),namedThreadFactory);

## 面试补充:线程池生产配置要点

线程池题建议从“参数含义、任务类型、队列选择、拒绝策略、监控治理”五个角度回答。

### 为什么不推荐 Executors 快捷方法

`Executors.newFixedThreadPool` 默认使用无界队列,流量高峰时任务可能无限堆积,最终导致内存膨胀和接口延迟失控。`newCachedThreadPool` 最大线程数接近无界,可能在下游变慢时创建大量线程,进一步放大故障。

### 核心参数怎么解释

`corePoolSize` 表示常驻工作线程数,`maximumPoolSize` 表示队列满后允许扩张的最大线程数,`workQueue` 决定任务排队能力,`keepAliveTime` 决定非核心线程回收时间,`RejectedExecutionHandler` 决定系统过载时如何反馈压力。

### 有界队列的价值

生产环境更推荐有界队列,因为它能把过载显式暴露出来。队列太大虽然短时间不报错,但会把延迟藏起来;当任务已经堆积很多时,即使系统恢复,新请求仍然会排在旧任务后面,用户看到的就是长时间超时。

### 拒绝策略怎么选

核心链路通常选择快速失败或调用方降级,避免无意义排队。后台任务可以记录日志后丢弃或进入补偿队列。`CallerRunsPolicy` 能反向压慢提交方,但要确认调用线程能承受同步执行任务,否则也可能拖慢主流程。

### 必须监控的指标

线程池上线后要监控活跃线程数、队列长度、任务执行耗时、拒绝次数、异常数量和任务堆积时间。线程池不是配置完就结束,真正的稳定性来自容量评估、压测校验和持续观测。

---

<!-- note-nav:start -->
Expand Down