Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行时确定CPU受限任务的最佳线程数?_Java_Multithreading - Fatal编程技术网

Java 如何在运行时确定CPU受限任务的最佳线程数?

Java 如何在运行时确定CPU受限任务的最佳线程数?,java,multithreading,Java,Multithreading,我正在实现一个规范化大数据集(单个文件)的程序,它是数学密集型计算,因此CPU有限 通过查找一些最佳线程问题,大多数问题都会导致: Runtime.getRuntime().availableProcessors() 但是使用HT技术,单个内核可以同时处理两个线程 前面的一些答案还指出,最优线程=内核数,我不确定它是否适用于CPU有限的任务 知道每个操作系统可能会不同地执行并行编程,如果我只使用可用的处理器()/,而不必考虑元素: 每个芯的螺纹数 每个插座的磁芯 CPU插槽 例如,我应该使

我正在实现一个规范化大数据集(单个文件)的程序,它是数学密集型计算,因此CPU有限

通过查找一些最佳线程问题,大多数问题都会导致:

Runtime.getRuntime().availableProcessors()
但是使用HT技术,单个内核可以同时处理两个线程

前面的一些答案还指出,最优线程=内核数,我不确定它是否适用于CPU有限的任务

知道每个操作系统可能会不同地执行并行编程,如果我只使用<代码>可用的处理器()/<代码>,而不必考虑元素:

  • 每个芯的螺纹数
  • 每个插座的磁芯
  • CPU插槽
例如,我应该使用每个内核的
可用处理器()
*线程来获得最佳线程吗?它会产生线程竞争吗

我正在寻找实现这一点的推荐做法,当程序移动到另一台机器时,无需修改和重建程序。(该程序仅在本地机器上测试)


提前感谢。

如果您试图为非阻塞CPU限制的任务找到最佳线程数

适用于
可用处理器()的Javadoc

请注意,
行返回Java虚拟机可用的处理器数量。

由于JVM在操作系统和Java程序之间的层上运行,因此它不返回物理处理器的数量,而是返回JVM逻辑处理器的数量。(逻辑处理器和物理处理器之间的协调取决于JVM和JVM运行的操作系统。)

所以如果你有

  • 1CPU插槽
  • 每个插座4个
  • 每个核心2个线程
可用处理器()
应返回小于或等于8的整数,具体取决于运行时环境。另一个例子:

  • 2个CPU插槽
  • 每个插座4个
  • 每个核心2个线程
这将返回小于等于16的整数,具体取决于运行时环境

因此最佳线程数应等于
可用处理器()。然而,要获得实际的最佳线程数,最好还是在环境中执行测试。因为您希望避免重建的复杂性,所以最好的方法可能是遵循Javadoc指令

Javadoc中也有说明: 因此,对可用处理器数量敏感的应用程序应偶尔轮询此属性并适当调整其资源使用情况。

如果希望减少线程争用开销,请查询此属性

public int availableProcessors()
Returns the number of processors available to the Java virtual machine.
This value may change during a particular invocation of the virtual machine. Applications that are sensitive to the number of available processors should therefore occasionally poll this property and adjust their resource usage appropriately.

Returns:
the maximum number of processors available to the virtual machine; never smaller than one
Since:
1.4