CPU 密集型、计算密集型,IO密集型

1、CPU 密集型、计算密集型
计算密集型,顾名思义就是应用需要非常多的CPU计算资源,在多核CPU时代,我们要让每一个CPU核心都参与计算,将CPU的性能充分利用起来,这样才算是没有浪费服务器配置,如果在非常好的服务器配置上还运行着单线程程序那将是多么重大的浪费。对于计算密集型的应用,完全是靠CPU的核数来工作,所以为了让它的优势完全发挥出来,避免过多的线程上下文切换,比较理想方案是:线程数 = CPU核数+1 也可以设置成CPU核数2,这还是要看JDK的使用版本,以及CPU配置(服务器的CPU有超线程)。对于JDK1.8来说,里面增加了一个并行计算,计算密集型的较理想线程数 = CPU内核线程数2
2、IO密集型
对于IO密集型的应用,就很好理解了,我们现在做的开发大部分都是WEB应用,涉及到大量的网络传输,不仅如此,与数据库,与缓存间的交互也涉及到IO,一旦发生IO,线程就会处于等待状态,当IO结束,数据准备好后,线程才会继续执行。因此从这里可以发现,对于IO密集型的应用,我们可以多设置一些线程池中线程的数量,这样就能让在等待IO的这段时间内,线程可以去做其它事,提高并发处理效率。 那么这个线程池的数据量是不是可以随便设置呢?当然不是的,请一定要记得,线程上下文切换是有代价的。目前总结了一套公式,对于IO密集型应用:线程数 = CPU核心数/(1-阻塞系数) 这个阻塞系数一般为0.8~0.9之间,也可以取0.8或者0.9。套用公式,对于双核CPU来说,它比较理想的线程数就是20,当然这都不是绝对的,需要根据实际情况以及实际业务来调整。

线程池是一种多线程处理形式,它能够在多核处理器上运行多个线程,提高资源利用率。合理的线程池配置可以有效提高应用程序处理任务的效率,对于CPU密集型任务IO密集型任务,通常有不同的配置策略。 CPU密集型任务通常涉及到计算量大、计算密集的操作,例如图形处理、数值计算等。这类任务主要消耗CPU资源,对CPU的利用率接近100%。对于CPU密集型任务,线程池的配置应当尽量减少上下文切换的开销,并且充分发挥CPU的处理能力。通常,CPU密集型任务的线程池大小可以配置为CPU核心数加一,这样可以利用多核优势,又不至于因为过多的线程导致频繁的上下文切换。 IO密集型任务则通常涉及到大量等待IO操作完成的情况,例如网络请求、文件读写等。这类任务的特点是CPU使用率并不高,但有大量的等待时间。为了提高效率,线程池的大小应该配置得更大,以便在等待IO操作时,CPU可以处理其他任务。IO密集型任务的线程池大小可以是CPU核心数的两倍左右,这样可以保持较高的CPU利用率,同时减少因等待IO操作而导致的线程空闲时间。 具体到线程池参数的配置,可以采用以下方法: 对于CPU密集型任务,可以配置一个固定大小的线程池,大小为`CPU核心数 + 1`: ```java int corePoolSize = Runtime.getRuntime().availableProcessors() + 1; ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); ``` 对于IO密集型任务,可以配置一个更大的固定大小或可变大小的线程池,大小可以设置为`CPU核心数 * 2`: ```java int corePoolSize = Runtime.getRuntime().availableProcessors() * 2; ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); ``` 在实际应用中,线程池的配置还需要考虑具体的应用场景需求,以及系统的资源状况,可能需要经过多次调整测试才能得到最优配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值