决策变量
- 有多少个CPU
- 有多大内存
- CPU 密集型,还是 I/O 密集型
- 文件句柄数
- 套接字句柄数
- 任务是否需要像 JDBC 连接这样的稀缺资源
线程池大小过大、过小存在的问题
如果过大,大量的线程竞争相对很少的 CPU 和内存资源,导致更高的内存使用量,而且还可能耗尽资源。
如果过小,存在空闲的处理器无任务可执行,降低了吞吐量。
计算方法
依据稀缺资源的资源池大小
线程池大小上限 = 资源总可用数量 / 每个任务对资源的需求量
依据计算、等待时长
线程池大小上限 = CPU核心数 * CPU期望利用率 * (任务执行总时长 / 任务CPU计算时长)
如何估算计算、等待时长
- 通过一些分析或临近工具来获得
- 在某个基准负载下,分别设置不同大小的线程池来运行应用程序,并观察CPU利用率
其它事项
- 不同类型的任务,应使用多个线程池
- 线程池大小可能反过来限制连接池大小,如线程池中任务是数据库连接池的唯一使用者时,小的线程池不需要大的连接池
参考书籍:《Java并发编程实战》