我正在使用一台配备 Intel Core i5 处理器的 PC,报告有 12 个处理器,我相信它由 6 个内核组成,每个内核有两个线程。
我做了一些研究,看来 Java 使用内核线程。我需要显着提高现有 Java 程序的性能,并希望我可以使用全部 12 个核心 i5 线程来实现此目的。
我正在尝试使用
IntStream().parallel.forEach()
Java 1.8 功能,看起来我可以使用尽可能多的线程并行化嵌套 for()
循环。
我关心的是:我的代码是否可以使用所有十二个线程,还是只能使用一个核心上的两个线程?
Java并行流使用ForkJoinPool.commonPool;它通过
Runtime.getRuntime().availableProcessors()
- 1 计算总线程数(这是为了留下一个处理器调用线程)。
所以在你的情况下它将是 12 -1 = 11 个处理器。
因此您可以使用 11 个线程进行多线程操作。
例如在我的系统上,我确实有 8 个可用处理器,并且我可以看到以下操作正在由 7 个线程执行:
System.out.println(Runtime.getRuntime().availableProcessors());
IntStream.range(0, 1000000).parallel()
.forEach(value -> System.out.println(value + " " + Thread.currentThread().getName()));
要了解您的机器上可以使用多少个处理器,您可以使用
availableProcessors()
,来自 java doc 的片段:
返回 Java 虚拟机可用的处理器数量。 该值可能会在虚拟机的特定调用期间发生变化。因此,对可用处理器数量敏感的应用程序应偶尔轮询此属性并适当调整其资源使用情况
代码:
public class CoresDemo {
public static void main(String[] args) {
int nCores = Runtime.getRuntime().availableProcessors();
System.out.println(nCores);
}
}