龙空技术网

线程池(ThreadPool)线程数量配置

拔土豆的程序员 381

前言:

当前同学们对“线程池数量设置”大约比较珍视,大家都需要学习一些“线程池数量设置”的相关资讯。那么小编同时在网络上网罗了一些有关“线程池数量设置””的相关文章,希望各位老铁们能喜欢,咱们一起来学习一下吧!

线程可以提升系统的执行效率,但是如果每个任务都创建一个线程去处理,这样线程会越来越多。创建和销毁线程比较耗时,频繁的创建和销毁线程会浪费很多CPU的资源。线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能。(可以通过 -Xss 进行配置:栈空间大小,栈是线程独占的,所以是一个线程使用栈空间的大小)。

综上:需要线程池(ThreadPool)去管理线程,不会出现内存资源被耗尽的情况,也不会出现频繁创建和销毁线程的情况,因为它内部是可以复用线程的。

线程池线程数量配置

经验或者说常规配置:N代表CPU核数

IO密集型:

配置线程数经验值是:2N频繁读取磁盘上的数据,或者需要通过网络远程调用接口

CPU密集型:

配置线程数经验值是:N + 1非常复杂的调用,循环次数很多,或者递归调用层次很深等

混合型:

如果IO密集型,和CPU密集型的执行时间相差不太大,可以拆分开配置多个线程池,以便于更好配置。如果执行时间相差太大,优化的意义不大,比如IO密集型耗时40s,CPU密集型耗时1s。

获取CPU核数代码:

public class ThreadTest {   public static void main(String[] args) {       int num = Runtime.getRuntime().availableProcessors();       System.out.println(num);  }}

最佳线程数目计算公式:

最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。

综上:最佳线程数目算法是更准确,但是线程等待时间和线程CPU时间在初始阶段并不是很好预估,一般用经验值就差不多了。再配合系统压测和线上观察,基本可以确定最适合的线程数。

线程池监控

可以参考一下美团的技术文章(Java线程池实现原理及其在美团业务中的实践 - 美团技术团队 (meituan.com)),也有一些开源的解决方案。

线程池参数动态化线程池监控

标签: #线程池数量设置 #线程池线程数量设置