【Java应用】设置线程池最佳的线程数

【Java应用】设置线程池最佳的线程数

一、前言

在使用线程池时,经常涉及到线程池应该设置多少线程的情况,它关系到我们程序执行的性能,大多数情况是凭经验设置,但是缺少依据;
在一般情况下,可以将程序分为CPU密集型I/O密集型,而对于这两种密集型程序来说,计算最佳线程数的方法是不同的。

二、CPU密集型
对于CPU密集型程序来说,多线程重在尽可能多地利用CPU的资源来处理任务,所以在理论上,线程数=CPU核数是最合适的。但是在实际工作中,一般会将线程数设置为:CPU核数+1,这是为了放在出现意外情况导致线程阻塞。如果某个线程因意外情况阻塞,那么出来的线程会继续执行任务,从而保证CPU的利用率;

因此,在CPU密集型的程序中,一般可以将线程数设置为:CPU核数+1。

三、I/O密集型
对于I/O密集型程序来说,如果在某个线程执行I/O操作时,另外的线程恰好执行完CPU计算任务,那么此时CPU的利用效率最佳。所以,在I/O密集型程序中,理论上最佳的程序数与程序中I/O操作的耗时和CPU计算的耗时的比值相关。
在单核CPU下,理论上的最佳线程数=1+(I/O操作的耗时/CPU计算的耗时)
在多核CPU下,理论上的最佳线程数=CPU核数 * (1+I/O操作的耗时/CPU计算的耗时)

四、总结
通过上述方式计算出的线程数只是理论上的最佳线程数,在实际工作中,还是需要对系统不断地进行压测,并根据压测的结果确定最佳的线程数;
在实际环境中,可能存在不同的进程或者存在多个线程的情况,所以需要设置的线程数,要结合实际运行环境的资源利用率情况;

注:获取CPU核数Runtime.getRuntime().availableProcessors();

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z.jiaminf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值