加载中...
线程池模式预先创建并维护一组可复用的工作线程,任务提交到队列后由空闲线程取出执行,避免了频繁创建销毁线程的开销,并能限制并发数量防止资源耗尽。它是服务器软件与并发框架中最基础的并发设计模式之一。

| 英文名 | Thread Pool |
| 类型 | 并发设计模式 |
| 核心结构 | 工作队列 + 工作线程 |
| 典型实现 | Java ThreadPoolExecutor |
| 解决问题 | 线程创建开销与并发上限 |
线程池模式(Thread Pool Pattern)是一种并发设计模式:程序预先创建固定或弹性数量的工作线程放入池中,待执行的任务被提交到一个队列,空闲线程不断从队列取任务执行,执行完毕后回到池中等待下一个任务,而不是每来一个任务就新建一个线程。
创建和销毁操作系统线程代价不小,每个线程还要占用独立栈内存;若对每个请求都新建线程,高并发下会造成频繁的上下文切换甚至内存耗尽。线程池以复用换开销、以队列做缓冲、以池大小做并发上限,成为 Web 服务器、数据库连接层、任务调度框架的标准做法。Java 的 ThreadPoolExecutor、.NET 的 ThreadPool 都是内置实现。
线程池适用于大量短小、彼此独立的任务,如处理网络请求、执行定时作业、并行化批量计算。实践中通常按任务类型分池:CPU 密集型任务的线程数接近处理器核数,IO 密集型任务可配置更多线程以掩盖等待时间。
问:线程池大小如何设定?答:CPU 密集型可取核数或核数加一;IO 密集型可按核数乘以(1 加上等待时间与计算时间之比)估算,再结合压测调整,不存在放之四海皆准的固定值。
问:什么是线程池饥饿死锁?答:池中任务又向同一个池提交子任务并等待其结果,当所有线程都在等待时,子任务永远无人执行,整体卡死。解决办法是拆分不同的池或使用支持工作窃取的框架。

| 英文名 | Thread Pool |
| 类型 | 并发设计模式 |
| 核心结构 | 工作队列 + 工作线程 |
| 典型实现 | Java ThreadPoolExecutor |
| 解决问题 | 线程创建开销与并发上限 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧