14.线程数量怎么制定?

什么是CPU 密集型任务和耗时 IO 型任务 ?

  • CPU 密集型任务

    • CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。
  • 耗时 IO 型任务

    • 数据库、文件的读写,网络通信等任务,这种任务的特点是并不会特别消耗 CPU 资源,但是 IO 操作很耗时,总体会占用比较多的时间。

怎么根据任务指定线程数量?

CPU 密集型任务

对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的线程数,实际上并不会起到很好的效果。

因为密集型任务如果创建过多的线程会因为本来计算任务重,但是还要进行争夺CPU资源造成上下文切换,反而更加导致性能下降。

耗时 IO 型任务

这种任务最大线程数一般会大于 CPU 核心数很多倍。

因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,如果我们设置过少的线程数,就可能导致 CPU 资源的浪费。

《Java并发编程实战》推荐

《Java并发编程实战》的作者 Brain Goetz 推荐的计算方法:

线程数 = CPU 核心数 *(1+平均等待时间/平均工作时间)

通过这个公式,我们可以计算出一个合理的线程数量,如果任务的平均等待时间长,
线程数就随之增加,而如果平均工作时间长,也就是对于我们上面的 CPU 密集型任务,线程数就随之减少。

所以总结下来:

线程的平均工作时间所占比例越高,就需要越少的线程;
线程的平均等待时间所占比例越高,就需要越多的线程;


版权声明:本文为daohangtaiqian原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。