线程池大小设置策略

决策变量

  • 有多少个CPU
  • 有多大内存
  • CPU 密集型,还是 I/O 密集型
  • 文件句柄数
  • 套接字句柄数
  • 任务是否需要像 JDBC 连接这样的稀缺资源

线程池大小过大、过小存在的问题

如果过大,大量的线程竞争相对很少的 CPU 和内存资源,导致更高的内存使用量,而且还可能耗尽资源。

如果过小,存在空闲的处理器无任务可执行,降低了吞吐量。

计算方法

依据稀缺资源的资源池大小

线程池大小上限 = 资源总可用数量 / 每个任务对资源的需求量

依据计算、等待时长

线程池大小上限 = CPU核心数 * CPU期望利用率 * (任务执行总时长 / 任务CPU计算时长)

如何估算计算、等待时长

  • 通过一些分析或临近工具来获得
  • 在某个基准负载下,分别设置不同大小的线程池来运行应用程序,并观察CPU利用率

其它事项

  • 不同类型的任务,应使用多个线程池
  • 线程池大小可能反过来限制连接池大小,如线程池中任务是数据库连接池的唯一使用者时,小的线程池不需要大的连接池

参考书籍:《Java并发编程实战》

上一篇:JDK8安装


下一篇:cpu的简单原理,以及信号传输