ThreadPoolExecutor运转机制详解

本文解析了ThreadPoolExecutor的工作原理及常见误区,介绍了如何通过合理配置核心线程数、最大线程数、任务队列等参数来高效利用线程池资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近发现几起对ThreadPoolExecutor的误用,其中包括自己,发现都是因为没有仔细看注释和内部运转机制,想当然的揣测参数导致,先看一下新建一个ThreadPoolExecutor的构建参数:

看这个参数很容易让人以为是线程池里保持corePoolSize个线程,如果不够用,就加线程入池直至maximumPoolSize大小,如果还不够就往workQueue里加,如果workQueue也不够就用RejectedExecutionHandler来做拒绝处理。

但实际情况不是这样,具体流程如下:

1)当池子大小小于corePoolSize就新建线程,并处理请求

2)当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去从workQueue中取任务并处理

3)当workQueue放不下新入的任务时,新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理

4)另外,当池子的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁

内部结构如下所示:

从中可以发现ThreadPoolExecutor就是依靠BlockingQueue的阻塞机制来维持线程池,当池子里的线程无事可干的时候就通过workQueue.take()阻塞住。

其实可以通过Executes来学学几种特殊的ThreadPoolExecutor是如何构建的。

newFixedThreadPool就是一个固定大小的ThreadPool

newCachedThreadPool比较适合没有固定大小并且比较快速就能完成的小任务,没必要维持一个Pool,这比直接new Thread来处理的好处是能在60秒内重用已创建的线程。

其他类型的ThreadPool看看构建参数再结合上面所说的特性就大致知道它的特性

### 技术面试中高频出现的八股文知识点总结 #### 数据库相关知识点 数据库是后端开发中的核心技术之一,以下是常见考点: ##### 索引的工作原理与优化 索引是一种特殊的查找结构,用于加速数据检索过程。B+树是最常用的索引结构,它通过减少磁盘I/O次数来提升查询效率[^1]。 ##### 事务的ACID特性 - **原子性(Atomicity)**:事务作为一个整体执行,要么全部成功,要么全部失败。 - **一致性(Consistency)**:事务前后数据必须保持一致状态。 - **隔离性(Isolation)**:多个事务并发执行时,彼此之间不应相互干扰。 - **持久性(Durability)**:一旦事务提交,其结果将是永久性的[^1]。 ##### 锁机制 锁是为了保证数据的一致性和完整性而设置的一种机制。常见的锁类型包括: - **行锁**:锁定单条记录,粒度较小,冲突概率低。 - **表锁**:锁定整个表,影响范围广,可能导致性能下降。 - **意向锁**:表示即将对某个层次加锁的意图[^1]。 ##### 性能优化 性能优化的核心在于找出瓶颈所在并针对性改进。具体方法包括但不限于: - 创建合适的索引来加快查询速度; - 避免全表扫描和不必要的子查询; - 利用缓存减轻数据库压力。 #### 计算机网络基础知识 计算机网络也是技术面试的重要组成部分,以下列举几个重点方向: ##### TCP三次握手与四次挥手 TCP连接建立需要经过三个步骤完成初始化序列号交换的过程称为三次握手;当双方都同意断开链接时,则会经历四个阶段结束通信即所谓的四次挥手[^2]。 ##### HTTP协议详解 HTTP是一个超文本传输协议,规定了浏览器如何向web服务器发送请求以及获取响应的具体细节。版本方面主要有两种形式分别是短连接模式下的http/1.x系列还有长连接支持多路复用特性的http/2及以上版本。 ##### 加密算法对比 加密技术对于网络安全至关重要,其中非对称加密因其独特的双钥体制备受青睐尽管存在运算成本高的缺点却依然广泛应用于SSL/TLS证书认证等领域之中。典型代表如RSA、DSA等均属于此类别[^2]。 #### 分布式系统设计要点 随着互联网规模不断扩大单一机器难以满足日益增长的需求因此产生了分布式架构设计理念下面简单罗列几项关键要素: ##### CAP理论权衡 任何分布式存储系统都无法同时做到强一致性(C)、高可用(A)以及分区容错(P),所以在实际部署当中往往依据应用场景做出适当妥协例如牺牲一定实时同步换取更高的稳定性和可扩展性等等[^1]. ##### 主从复制策略 主从复制指得是从一台主机读写操作之后将更改同步给若干台备机从而达到负载均衡目的同时也增强了容灾恢复能力不过需要注意的是如果单纯依靠异步方式进行传播可能会造成数据丢失风险所以有必要引入semi-sync semi-synchronous replication之类的技术手段加以弥补[^1]. ##### 负载均衡实现方式 为了使各个节点间任务分配更加均匀合理通常采取轮询法(Random Round Robin Algorithm)或者最小连接数法则(Least Connection Methodology)配合健康检查定期探测目标存活状况进而动态调整权重比例确保整体运转顺畅高效. --- ```python # 示例代码展示简单的线程池实现 from concurrent.futures import ThreadPoolExecutor def task(n): """模拟耗时任务""" print(f"Processing {n}") return n * n with ThreadPoolExecutor(max_workers=5) as executor: results = list(executor.map(task, range(10))) print(results) ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值