精华内容
下载资源
问答
  • 对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU 核心数的 2 倍以上,因为计算任务非常重,会占用大量的 CPU 资源,所以...

    CPU 密集型任务

    首先,我们来看 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU 核心数的 2 倍以上,因为计算任务非常重,会占用大量的 CPU 资源,所以这时 CPU 的每个核心工作基本都是满负荷的,而我们又设置了过多的线程,每个线程都想去利用 CPU 资源来执行自己的任务,这就会造成不必要的上下文切换,此时线程数的增多并没有让性能提升,反而由于线程数量过多会导致性能下降

    针对这种情况,最好还要同时考虑在同一台机器上还有哪些其他会占用过多 CPU 资源的程序在运行,然后对资源使用做整体的平衡

    耗时 IO 型任务

    比如数据库、文件的读写,网络通信等任务,这种任务的特点是并不会特别消耗 CPU 资源,但是 IO 操作很耗时,总体会占用比较多的时间。对于这种任务最大线程数一般会大于 CPU 核心数很多倍,因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,如果我们设置过少的线程数,就可能导致 CPU 资源的浪费。而如果我们设置更多的线程数,那么当一部分线程正在等待 IO 的时候,它们此时并不需要 CPU 来计算,那么另外的线程便可以利用 CPU 去执行其他的任务,互不影响,这样的话在任务队列中等待的任务就会减少,可以更好地利用资源

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

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

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

    太少的线程数会使得程序整体性能降低,而过多的线程也会消耗内存等其他资源,所以如果想要更准确的话,可以进行压测,监控 JVM 的线程情况以及 CPU 的负载情况,根据实际情况衡量应该创建的线程数,合理并充分利用资源

    结论

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

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

    • 针对不同的程序,进行对应的实际测试就可以得到最合适的选择

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • CPU 核心数和线程数的关系? CPU 密集型任务 首先,我们来看 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的...

    合适的线程数量是多少?CPU 核心数和线程数的关系?

    CPU 密集型任务
    首先,我们来看 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU 核心数的 2 倍以上,因为计算任务非常重,会占用大量的 CPU 资源,所以这时 CPU 的每个核心工作基本都是满负荷的,而我们又设置了过多的线程,每个线程都想去利用 CPU 资源来执行自己的任务,这就会造成不必要的上下文切换,此时线程数的增多并没有让性能提升,反而由于线程数量过多会导致性能下降。

    针对这种情况,我们最好还要同时考虑在同一台机器上还有哪些其他会占用过多 CPU 资源的程序在运行,然后对资源使用做整体的平衡。

    耗时 IO 型任务
    第二种任务是耗时 IO 型,比如数据库、文件的读写,网络通信等任务,这种任务的特点是并不会特别消耗 CPU 资源,但是 IO 操作很耗时,总体会占用比较多的时间。对于这种任务最大线程数一般会大于 CPU 核心数很多倍,因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,如果我们设置过少的线程数,就可能导致 CPU 资源的浪费。而如果我们设置更多的线程数,那么当一部分线程正在等待 IO 的时候,它们此时并不需要 CPU 来计算,那么另外的线程便可以利用 CPU 去执行其他的任务,互不影响,这样的话在任务队列中等待的任务就会减少,可以更好地利用资源。

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

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

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

    太少的线程数会使得程序整体性能降低,而过多的线程也会消耗内存等其他资源,所以如果想要更准确的话,可以进行压测,监控 JVM 的线程情况以及 CPU 的负载情况,根据实际情况衡量应该创建的线程数,合理并充分利用资源。

    结论:

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

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

    • 针对不同的程序,进行对应的实际测试就可以得到最合适的选择。

    展开全文
  • CPU 使用率较高(也就是一些复杂运算,逻辑处理)非常多的情况下,线程数一般只需要CPU核心数的线程就可以了。 这一类型多出现在开发中的一些业务复杂计算和逻辑处理过程中。 二.I/O密集型 CPU 使用率较低,程序中会...
    线程数量是否设置越多越好呢?

    一.CPU 密集型

    CPU 使用率较高(也就是经常计算一些复杂的运算,逻辑处理等情况)非常多的情况下,线程数一般只需要设置为CPU核心数的线程个数就可以了。 这一类型多出现在开发中的一些业务复杂计算和逻辑处理过程中。

    二.I/O 密集型

    CPU 使用率较低,程序中会存在大量的 I/O 操作占用时间,导致线程空余时间很多,所以通常就需要开CPU核心数两倍的线程。当线程进行 I/O 操作 CPU 空闲时,启用其他线程继续使用 CPU,以提高 CPU 的使用率。

    线程等待时间所占比例越高,需要越多线程,启用其他线程继续使用CPU,以此提高CPU的利用率;线程 CPU 时间所占比例越高,需要越少的线程,这一类型在开发中主要出现在一些计算业务频繁的逻辑中。

    三.总结

    • 一个计算为主的程序(CPU密集型程序),多线程跑的时候,可以充分利用起所有的 CPU 核心数,比如说 8 个核心的CPU ,开8 个线程的时候,可以同时跑 8 个线程的运算任务,此时是最大效率。但是如果线程远远超出 CPU 核心数量,反而会使得任务效率下降,因为频繁的切换线程也是要消耗时间的。因此对于 CPU 密集型的任务来说,线程数等于 CPU 数是最好的了。
    • 如果是一个磁盘或网络为主的程序(IO密集型程序),一个线程处在 IO 等待的时候,另一个线程还可以在 CPU 里面跑,有时候 CPU 闲着没事干,所有的线程都在等着 IO,这时候他们就是同时的了,而单线程的话此时还是在一个一个等待的。我们都知道 IO 的速度比起 CPU 来是很慢的。此时线程数等于CPU核心数的两倍是最佳的。
    展开全文
  • 创建线程池有个CorePoolSize参数,指的是核心线程数,该参数应该设置为多大呢? CPU密集型 一般公式:CPU核数 + 1 通过以下代码动态获取CPU核数: Runtime.getRuntime().availableProcessors() IO密集型 (1)...

    创建线程池有个CorePoolSize参数,指的是核心线程数,该参数应该设置为多大呢?

    CPU密集型

    一般公式:CPU核数 + 1


    通过以下代码动态获取CPU核数:

    Runtime.getRuntime().availableProcessors()
    

    IO密集型

    (1)配置方式一

    IO密集型任务线程并不是一直在执行任务,则应该配置尽可能多的线程

    例如:CPU核数 * 2


    (2)配置方式二

    CPU核数 / (1 - 阻塞系数),阻塞系数在0.8~0.9之间

    两种方式并没有绝对的最优,实际生产环境应该结合压力测试进行调整

    展开全文
  • Java线程池如何合理配置核心线程数?

    千次阅读 2020-08-26 10:46:52
    配置核心线程数 Java线程池如何合理配置核心线程数?分下面两个步骤分析: 第一步:先看下机器的CPU核数,然后再设定具体参数 CPU核数=Runtime.getRuntime().availableProcessors() System.out.println(Runtime....
  • 多线程线程数设置多少合适

    千次阅读 2020-06-30 01:15:04
    首先要考虑到 CPU 核心数,那么在 Java 中如何获取核心线程数? 可以使用 Runtime.getRuntime().availableProcessor() 方法来获取(可能不准确,作为参考) 或者直接去服务器查看 温故为什么使用线程 场景 如果有两...
  • android 线程池核心线程数的确定

    千次阅读 2018-10-11 18:51:25
    1、一般情况下对于计算密集型线程池的核心线程数可以设置为CPU的个数,充分利用CPU来完成我们的计算任务 Java通过Runtime.getRuntime().availableProcessors();来获取CPU核心数 2、对于io(读写文件、读写数据库...
  • java线程池合理设置最大线程数和核心线程数

    千次阅读 热门讨论 2020-10-10 17:13:31
    这个时候就需要使用多线程去处理。 一开始是这么配置的: @Configuration @EnableAsync(proxyTargetClass = true)//利用@EnableAsync注解开启异步任务支持 @ComponentScan({"com.ctfojt.auditbcarslogo.service"}) /...
  • 核心线程数的设置

    千次阅读 2020-04-08 00:03:24
    线程池线程数可以设置为CPU核数+1 4、低并发,耗时长 a) IO密集型:假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以可以加大线程池中的线程数目,这样一个io任务可能会执行很长...
  • 一、创建多少线程合适? 二、ThreadPoolExecutor构造函数 2.1 添加任务线程池调整流程 2.2 拒绝任务handler有四个选择: 策略1:ThreadPoolExecutor.AbortPolicy 策略2:ThreadPoolExecutor.CallerRunsPolicy ...
  • ThreadPoolExecutor是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它实现了任务提交、线程管理、监控等等方法。 来看看ThreadPoolExecutor类的构造方法源码,其他创建线程池的方法最终都会导向这个...
  • 1.线程池和CPU核心数的关系 一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU processors的个数) (1)如果是CPU密集型应用,则线程池大小设置为N+1(或者是N),线程的应用场景:主要是复杂算法 (2...
  • 线程池合适线程数量是多少?

    千次阅读 2020-06-28 12:00:33
    本章主要讨论线程池合适的线程数量是多少,以及 CPU 核心数和线程数的关系。我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。在实际工作中,我们...
  • <p style="text-align:center"><img alt="" height="433" src="https://img-ask.csdnimg.cn/upload/1604910827649.png" width="581" /></p> <p> </p>
  • 文章目录创建多少线程合适?1.为什么要使用多线程?CPU密集型程序I/O密集型程序2.创建多少线程合适?CPU密集型程序创建多少线程合适?I/O密集型程序创建多少线程合适?3.例题:第一题:第二题:增加CPU核心...
  • 当cpu核心数<线程数时,cpu就需要在多个线程直接来回切换,以保证每个线程都会获得cpu时间,即通常我们说的并发执行。 所以 maxThreads 的配置绝对不是越大越好。 现实应用中,我们的操作都会包含以上两种类型...
  • 游戏服务器启动多少线程合适

    千次阅读 2018-10-07 22:34:10
    线程是服务器的一种希有资源,它的创建,销毁,切换都需要很多服务器的其它资源。...先不说游戏服务器的特殊性,就按普通的服务器业务来说,最合适线程数多少呢?说到线程,那一定是和cpu核数...
  • 线程多少合适

    2020-07-01 11:59:18
    简单来说 CPU 密集型: 最佳线程数 = CPU 核数(逻辑)+ 1 ...最佳线程数 = CPU核心数 * (1/CPU利用率) = CPU核心数 * (1 + (I/O耗时/CPU耗时)) 详见:https://www.jianshu.com/p/f30ee2346f9f ...
  • Java多线程:创建多少线程合适

    千次阅读 2019-09-05 13:25:46
    1、线程执行 线程的执行是由CPU进行调度的,一个CPU在同一时刻只会执行一个线程 操作系统利用了时间片轮转的方式,CPU给每...度量性能的指标最核心的就是延迟和吞吐量。延迟指的是发出请求到收到响应这个过程的时...
  • 为什么要设置线程数量 我们在开发中使用线程池是为了避免线程反复创建和销毁的开销,而线程池中的线程数也应该设置...线程数 = CPU 核心数 *(1+平均等待时间/平均工作时间) 一般情况下,直接参照这个计算公式来...
  • 分2派 来自<<java并发编程实践>>书籍 Nthreads=Ncpu*Ucpu*(1+w/c),其中 ...对于派1,假设cpu100%运转,即撇开CPU使用率这个因素,线程数=Ncpu*(1+w/c)。 现在假设将派2的公式等于...
  • 所以对于CPU密集型程序, CPU 核数(逻辑)+ 1个线程数是比较好的经验值的原因了 I/O密集型程序创建多少个线程合适? 最佳线程数 = (1/CPU利用率)=1 + (I/O耗时/CPU耗时) I/O 密集型程序的最佳线程数就是: ...
  • 配置线程池时线程数设置多少

    千次阅读 2014-04-14 23:14:15
    一般总结哦,有其他更好的方式,希望各位留言,谢谢...CPU密集型时,任务可以少配置线程数,大概和机器的cpu核数相当,这样可以使得每个线程都在执行任务 IO密集型时,大部分线程都阻塞,故需要多配置线程数,2*cpu核数
  • 使用JDK 自带的工具 VisualVM 来查看线程等待时间和线程工作时间 使用公式确定 线程数 = CPU 核心数 *(1+平均等待时间/平均工作时间)
  • 一个并发程序开多少线程合适

    万次阅读 2015-10-05 19:16:20
    最近在和朋友讨论的过程中,朋友说线程开得多性能好,理由是系统中已经有成百上千的线程,并发程序开的线程越多分配到CPU...最好起CPU核心数量*2 个线程 或者 CPU核心数量*2 +2 个线程 测试场景: 硬件:HP G6(8
  • 线程 https://www.jianshu.com/p/f30ee2346f9f
  • 为什么要使用多线程? 防止并发编程出错最好的办法就是不写并发程序 既然多线程编程容易出错,为什么它还经久不衰呢? A:那还用说,肯定在某些方面有特长呗,比如你知道的【它很快,非常快】 我也很赞同这个答案...
  • 线程数:设多少最合理?

    千次阅读 2020-11-26 09:15:00
    (首次公开)工作线程数,设多少合适?如何理解N*C*(1+C/W)的计算公式? 扫码,即可领取三道大厂面试题答案哦!!! 遇到扫码频繁,请再次识别哦 (内容的价值取决于您的行动,千万莫做收藏家) 每一期都很火爆 ...
  • 一、需求缘起 Web-Server通常有个配置,最大工作线程数,后端服务一般也有个...“工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能,是本文要讨论的问题。   二、共性认知 在进行进一步深入讨...
  • 面试问我,创建多少线程合适?我该怎么说

    千次阅读 多人点赞 2020-04-08 08:02:15
    | 如果好看,请给个赞 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...为什么要使用多线程? 防止并发编...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,640
精华内容 25,456
关键字:

多少合适核心线程数