前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中创建多少线程才是合适的?

Java中创建多少线程才是合适的?

作者头像
程序员小强
发布2019-08-09 13:45:07
3.1K0
发布2019-08-09 13:45:07
举报
文章被收录于专栏:小强的进阶之路

预计阅读时间:4分钟

大家都知道多线程可以提高程序整体执行效率,但是为什么多线程可以执行效率呢?线程是越多越好吗?如何估算线程数以使程序执行吞吐量达到最优呢?

为什么要使用多线程?

使用多线程,本质上是为了提升程序性能。但是,如何度量性能呢?度量性能的最核心的两个指标是:延迟和吞吐量。延迟:指的是发出请求到收到响应过程的时间,延迟越短,意味着性能越好;吞吐量:指的是在单位时间内能处理请求的数量,吞吐量越大,意味着性能越好。所以,从度量的角度看,提升性能主要是降低延迟,提升吞吐量。

多线程的应用场景

在并发编程领域,提升性能本质上就是提升硬件的利用率,就是提升I/O利用率和CPU利用率。比如,如果CPU和I/O操作的耗时是1:1(这里假设CPU和I/O执行效率是一致的),如果只有一个线程,执行CPU计算的时候I/O设备是空闲的,执行I/O操作的时候CPU是空闲的,所以CPU和I/O利用率都是50%。如果有两个线程,在线程A执行CPU计算的时候线程B执行I/O操作,线程A执行I/O操作的时候线程B执行CPU计算,这样CPU和I/O设备的利用率都达到了100%。我们很容易看出,将CPU和I/O利用率从50%提升到100%,程序吞吐量提高了1倍。如果CPU和I/O利用率很低,我们可以通过增加线程的方式提高程序性能,那么,线程是不是越多越好呢?可能有同学发现线程增加的越多程序整体性能反而会越慢,这是因为多线程有上下文切换成本,线程越多线程上下文切换成本越高,所以单纯的提高线程数量并不能提高系统性能,性能反而会越来越低。

创建多少个线程合适呢?

我们的程序一般都是CPU计算和I/O操作交叉执行的,由于I/O设备的速度相对于CPU来说都很慢,所以大部分情况下I/O操作执行的时间相对于CPU计算来说都非常长,这种场景我们称为I/O密集型计算;和I/O密集型计算相对的是CPU密集型计算,CPU密集型计算大部分情况下都是纯CPU计算。

对于CPU密集型计算,多线程是为了提高多核CPU的利用率,理论上线程数=CPU核心数是最合适的,不过实际设置过程中会设置成CPU核心数+1,这样是为了在线程在某些原因造成阻塞时,而外的线程可以顶上,保障了CPU利用率。

对于I/O密集型计算,系统大部分时间用来处理I/O交互,而线程在处理I/O的时间段内不会占用CPU来处理,这时可以将CPU交出给其他线程使用。在I/O密集型任务中,我们可以多配置一些线程,具体计算方式是2 * CPU核心数。

对于常规的业务操作,我们可以参考以下公式来配置线程数:线程数 = N(CPU核心数) * (1 + WT(线程等待时间) / ST(线程时间运行时间)),我们可以通过VisualVM查看WT/ST比例。

总结

对于CPU密集型计算任务,线程数 = CPU核心数 + 1

对于I/O密集型计算任务,线程数 = 2 * CPU核心数

对于普通任务,线程数 = N(CPU核心数) * (1 + WT(线程等待时间) / ST(线程时间运行时间))

End

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MoziInnovations 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档