java多线程如何确定线程数_关于多线程:如何在Java并行程序中获得理想的线程数?...

我需要在批处理程序中获得理想数量的线程,该程序在支持并行模式的批处理框架中运行,例如Spring Batch中的并行步骤。

据我所知,太多的线程无法执行程序的步骤是不好的,这可能会对程序的性能产生负面影响。某些因素可能会导致性能下降(上下文切换,使用共享资源时的竞争条件(锁定,同步.....)(还有其他因素吗?))。

当然,获得理想线程数的最好方法是对我进行实际的程序测试,以调整程序的线程数。但是在我的情况下,进行实际测试并不容易,因为测试需要很多东西(人员,测试计划,测试数据等),这对于我现在来说太难了。因此,在进行实际测试之前,我想尽可能地了解获取程序的可猜测理想线程数的方法。

我应该考虑什么才能获得理想的程序线程(步数)? CPU核心数?运行我的程序的计算机上的进程数?数据库连接数?

在这种情况下是否存在诸如公式之类的合理方式?

通常Runtime.getRuntime().availableProcessors();就足够了。

最重要的考虑因素是您的应用程序/计算是CPU约束还是IO约束。 如果其IO受限(单个线程将大部分时间都花在等待外部资源,例如数据库连接,文件系统或其他外部数据源上),那么您可以分配(许多)线程数超过可用处理器的数量- 当然,有多少也取决于外部资源的扩展能力-本地文件系统,可能性不大。 如果其(主要是)CPU受到限制,那么最好稍微超过可用处理器的数量。

@Erwin我会赞成这个。 将其发布为答案。

最重要的考虑因素是您的应用程序/计算是CPU约束还是IO约束。

如果它是IO受限的(单个线程将大部分时间都花在等待外部资源,例如数据库连接,文件系统或其他外部数据源上),那么您可以分配(很多)线程数多于可用处理器的数量-当然,有多少也取决于外部资源的扩展能力-本地文件系统,可能性不大。

如果(主要是)CPU限制,则稍微超过

可用的处理器可能是最好的。

谢谢您的好回答。 但是我还有一个问题。 如您所说,将可用处理器的数量设置为程序的线程数可能是绑定CPU的最佳方法。 如果在要运行程序的同一台计算机上运行许多其他程序,这仍然有效吗? 我说的是CPU的工作方式。 我认为CPU已经很忙,没有运行我的程序。

@thatsyou:切勿浪费时间思考您无法控制的事情。 关键是,线程数少于内核数意味着您永远无法利用所有内核。 具有比(可用)核心更多的线程,仅表示线程必须共享核心。 除非我们谈论每个内核数百或数千个线程,否则调度开销可以忽略不计。

一般公式:

线程数<=(内核数)/(1-阻塞因子)

其中0 <=阻塞因子<1

机器核心数:Runtime.getRuntime().availableProcessors()

您可以并行化的线程数,您可以通过打印以下代码获得:

ForkJoinPool.commonPool()

并行度是您计算机的核心数量-1。因为那个是主线程。

源链接

时间:1:09:00

谢谢@AndreaLigios

什么是阻塞因子,或者您如何计算?

What should I consider to get the ideal number of threads(steps) of my program?? number of CPU cores?? number of processes on a machine on which my program would run?? number of database connection?? Is there a rational way such as a formula in a situation like this?

如果您对线程的实际代码不了解很多,这将非常困难。正如@Erwin所提到的那样,IO和CPU绑定操作是您需要知道的关键知识,即使您确定对应用程序进行线程化是否可以进行任何改进。即使您确实设法找到了特定硬件的最佳选择,也可能会在另一台服务器(或虚拟云节点的其他实例)上启动,并看到完全不同的性能数字。

要考虑的一件事是在运行时更改线程数。 ThreadPoolExecutor.setCorePoolSize(...)设计为在线程池运行之后被调用。您可以公开一些JMX挂钩来手动执行此操作。

您还可以允许您的应用程序在运行时监视应用程序或系统的CPU使用情况,并根据该反馈调整值。您还可以保留AtomicLong吞吐量计数器,并在运行时上下拨线程,以最大化吞吐量。然而,正确地做到这一点可能很棘手。

我通常会尝试:

最好地猜测线程号

检测您的应用程序,以便可以确定不同数量的线程的影响

允许它在运行时通过JMX进行调整,以便可以看到影响

确保线程数是可配置的(可能通过系统属性),因此您不必重新释放即可尝试不同的线程数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值