当前位置: 主页 > JAVA语言

java线程池最大线程数-java 线程池大小 设定

发布时间:2023-02-13 10:15   浏览次数:次   作者:佚名

线程池核心数和最大线程数设置汇总:

核心线程

CPU密集型:核心线程数=CPU核心数(或核心线程数=CPU核心数+1)

I/O密集型:核心线程数=2*CPU核心数(或核心线程数=CPU核心数/(1-阻塞因子))

混合型:核心线程数=(线程等待时间/线程CPU时间+1)*CPU核心数

java线程池应用_java线程池最大线程数_java 线程池大小 设定

最大线程

对于IO密集型体验应用,最大线程设置为2N+1(N为CPU个数,下同)

对于CPU密集型应用,最大线程数设置为N+1

想往下看

java线程池应用_java线程池最大线程数_java 线程池大小 设定

线程池中核心线程数过多或过少是否有影响? 如何合理设置线程池的核心线程数? 这是程序员在日常开发中使用线程池时经常需要考虑的问题。 以下是详细介绍。

1.当线程池中的核心线程数过多或过少时

当线程池中的核心线程数过多时,线程会争抢CPU资源,从而导致上下文切换。 过多的上下文切换会增加线程的执行时间,影响整体的执行效率;

在多线程编程中,线程数一般大于CPU核数,一个CPU核在任何时候都只能被一个线程使用。 为了让这些线程能够得到有效的执行,CPU采用的策略是为每个线程分配时间片,轮换的形式。 当一个线程的时间片用完后,它会再次准备好供其他线程使用。 这个过程是上下文切换。

java 线程池大小 设定_java线程池最大线程数_java线程池应用

当线程池中的核心线程数量过少时,如果同时有大量任务需要处理,可能会导致大量任务在任务队列中排队等待执行,甚至任务队列满后无法执行,或者大量任务堆积导致任务队列内存不足(OOM)。

二、任务性质

在讨论设置核心线程数之前,我们先了解一下任务的本质,主要分为CPU密集型(计算密集型)任务、I/O密集型任务和混合型任务:

CPU-intensive(计算密集型):系统的I/O读写效率高于CPU效率。 大多数情况下java线程池最大线程数,CPU 有很多操作要处理,使用率很高。 但是 I/O 执行得很快。

java 线程池大小 设定_java线程池应用_java线程池最大线程数

I/O密集型:系统的CPU性能远高于磁盘读写性能。 大多数情况下,CPU在等待I/O读写操作,此时CPU占用率并不高;

混合任务:CPU 密集型和 I/O 密集型。

3.合理设置核心线程数

对于CPU密集型任务,由于CPU密集型任务的性质,CPU使用率较高。 如果线程池中的核心线程数过多,上下文切换的次数会增加,从而产生额外的开销。 所以,一般情况下,线程池的核心线程数等于CPU核心数+1。(注意:这里的核心线程数不等于CPU核心数,因为认为是CPU密集型任务因为某种原因被挂起,这时候有额外的线程来保证此时CPU不会被浪费。但是同时也会增加一个CPU上下文切换,所以核心线程数等于CPU核心数?还是CPU核心数+1?可根据实际情况确定)

java线程池最大线程数_java 线程池大小 设定_java线程池应用

对于I/O密集型任务,由于I/O密集型任务的CPU使用率不是很高,可以在等待I/O操作的同时,利用CPU处理其他任务,充分利用CPU。 因此,一般情况下,一个线程的核心线程数等于2*CPU核心数。 (注:有些公司会考虑要求的CPU阻塞系数java线程池最大线程数,即核心线程数=CPU核心数/(1-阻塞系数))

对于混合任务,由于包含两种类型的任务,混合任务的线程数与线程时间有关。 一般来说:线程池的核心线程数=(线程等待时间/线程CPU时间+1)*CPU核心数; 在某些情况下,任务也可以分为I/O密集型任务和CPU密集型任务,任务由不同的线程池处理,但是有一个前提——分离后两个任务的执行时间相差不会太大。

————————————————

版权声明:本文为CSDN博主“to_real”原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接: