如何在Java中的并行程序中获得理想数量的线程?

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

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

当然,获得理想线程数的最佳方法是让我进行实际的程序测试,以调整程序的线程数。但在我的情况下,进行实际测试并不容易,因为测试需要很多东西(人员,测试计划,测试数据等),这对我来说太难了,现在很难准备。因此,在进行实际测试之前,我想知道如何尽可能地获得可猜测的程序的理想线程数。我应该考虑什么才能获得程序的理想线程数(步骤)?CPU 内核数??我的程序将在其上运行的计算机上的进程数??数据库连接数??在这样的情况下,有没有像公式这样的理性方法?


答案 1

最重要的考虑因素是应用程序/计算是 CPU 密集型还是 IO 密集型。

  • 如果它是IO绑定的(单个线程花费大部分时间等待外部资源,例如数据库连接,文件系统或其他外部数据源),那么您可以分配(许多)比可用处理器数量更多的线程 - 当然,多少还取决于外部资源的扩展程度 - 本地文件系统, 可能不是那么多。
  • 如果它(大部分)受 CPU 限制,那么稍微超过可用处理器的数量可能是最好的。

答案 2

一般公式:

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

其中 0 < = 阻塞因子 < 1

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

线程数你可以并行,你将通过打印出这个代码得到:

ForkJoinPool.commonPool()

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

源链接

时间 : 1:09:00


推荐