我正在实现一个标准化大数据集(单个文件)的程序,它的运算量很大,因此受CPU限制。
查找了一些最佳线程问题,大多数导致了这一问题:
Runtime.getRuntime().availableProcessors()
但是使用HT技术,单个内核可以同时处理两个线程。
先前的一些答案还指出,最佳线程=内核数,我不确定对于CPU密集型任务是否正确。
知道每个操作系统可能会以不同的方式执行并行编程,如果我仅使用availableProcessors()
而不必考虑诸如以下的元素:
例如,我应该使用availableProcessors()
* 每个核心的线程来获得最佳线程吗?它会引起线程竞争吗?
我正在寻找一种推荐的方法来实现这一目标,而不必在程序移至另一台计算机时修改和重建程序。(该程序仅在本地计算机上进行了测试)
谢谢。
答案 0 :(得分:2)
如果您要为不受阻塞的CPU绑定任务寻找最佳线程号。
availableProcessors()
的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
请注意,该行-Returns the number of processors available to the Java virtual machine.
由于JVM在OS和Java程序之间的层上运行,因此它不返回物理处理器的数量,而是返回JVM逻辑处理器的数量。(逻辑处理器和物理处理器之间的协调取决于JVM和OS JVM正在运行。)
因此,如果您有
availableProcessors()
应该返回小于或等于 8 的整数,具体取决于运行时环境。另一个例子:
这将返回小于等于 16 的整数,具体取决于运行时环境。
因此,最佳线程数应等于availableProcessors()
。但是,要获得实际的最佳线程数,仍然最好在环境上进行测试。由于您想避免重建的麻烦,因此最好的办法是遵循Javadoc指令。
在Javadoc中也有说明:
Applications that are sensitive to the number of available processors should therefore occasionally poll this property and adjust their resource usage appropriately.
。
如果希望减少线程竞赛的开销,请查询此属性。