线程池应该设置多少核心线程数——Java多线程系列学习笔记
Posted 来老铁干了这碗代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池应该设置多少核心线程数——Java多线程系列学习笔记相关的知识,希望对你有一定的参考价值。
前言
本章主要讨论线程池合适的线程数量是多少,以及 CPU 核心数和线程数的关系。我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应的策略。
1. CPU密集型
第一种是 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。
最佳线程数 = CPU 核心数的 1~2 倍
如果设置过多的线程,实际上并不会起到很好的效果。此时假设我们设置的线程数是 CPU 核心数的 2 倍以上,因为计算机的任务很重,会占用大量的 CPU 资源,所以这是 CPU 每个核心都是满负荷工作,而设置过多的线程数,每个线程都去抢占 CPU 资源,就会产生不必要的上下文切换,反而会造成整体性能的下降。
2. IO密集型
第二种任务是耗时 IO 型,比如数据库、文件的读写,网络通信等任务,这种任务的特点是并不会特别消耗 CPU 资源,但是 IO 操作很耗时,总体会占用比较多的时间。
对于这种情况任务最大线程数一般会大于 CPU 核心数很多倍,因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,如果我们设置过少的线程数,可能导致 CPU 资源的浪费。而如果我们设置更多的线程数,那么当一部分线程正在等待 IO 的时候,它们此时并不需要 CPU 来计算,那么另外的线程便可以利用 CPU 去执行其他的任务,互不影响,这样的话在任务队列中等待的任务就会减少,可以更好地利用资源。
3. 通用公式
通过这个公式,我们可以计算出一个合理的线程数量,如果任务的 IO 耗时时间长,线程数就随之增加,而如果CPU 耗时长,也就是对于我们上面的 CPU 密集型任务,线程数就随之减少。
太少的线程数会使得程序整体性能降低,而过多的线程也会消耗内存等其他资源,所以如果想要更准确的话,可以进行压测,监控 JVM 的线程情况以及 CPU 的负载情况,根据实际情况衡量应该创建的线程数,合理并充分利用资源。
4. 结论
综上所述我们就可以得出以下结论:
线程的 CPU 耗时所占比例越高,就需要越少的线程
线程的 IO 耗时所占比例越高,就需要越多的线程
针对不同的程序,进行对应的实际测试就可以得到最合适的选择
线程数 >= CPU 核心数
以上是关于线程池应该设置多少核心线程数——Java多线程系列学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
线程池大小设置,CPU的核心数线程数的关系和区别,同步与堵塞完全是两码事