Java 线程池参数怎么理解
线程池的价值在于复用线程、限制并发、管理任务队列。理解线程池参数,比记住某个固定配置更重要。
核心参数
ThreadPoolExecutor 常见参数包括:
corePoolSize:核心线程数;maximumPoolSize:最大线程数;keepAliveTime:非核心线程空闲存活时间;workQueue:任务队列;threadFactory:线程创建方式;handler:拒绝策略。
这些参数共同决定任务来了之后如何排队、扩容和拒绝。
任务提交后的流程
一个简化流程是:
- 当前线程数小于
corePoolSize,创建核心线程执行; - 核心线程已满,任务进入队列;
- 队列满了,尝试创建非核心线程,直到
maximumPoolSize; - 仍然无法处理,触发拒绝策略。
因此队列类型会影响最大线程数是否容易生效。无界队列可能让任务一直排队,导致最大线程数很少被用到。
CPU 密集与 IO 密集
CPU 密集任务主要消耗计算资源,线程数通常接近 CPU 核心数。IO 密集任务经常等待网络或磁盘,可以使用更多线程,但也不能无限增加。
判断线程数是否合理,最好结合实际指标:CPU 使用率、队列长度、响应时间、拒绝次数。
拒绝策略不是摆设
拒绝策略代表系统过载时的行为。常见策略包括抛异常、调用者执行、丢弃任务等。不同场景应选择不同策略,不能只把队列调大来掩盖问题。
小结
线程池配置没有万能公式。核心思路是限制并发、控制排队、明确过载行为,并通过监控数据持续调整。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 xiaobai050!