Java Intel 酷睿 i5 处理器上的多线程
Java multi-threading on an Intel core i5 processor
我正在使用配备 Intel Core i5 处理器的 PC,据报道它有 12 个处理器,我认为它由 6 个内核组成,每个内核有两个线程。
我做了一些研究,Java 似乎使用了内核线程。我需要显着提高现有 Java 程序的性能,并希望我可以使用全部 12 个核心 i5 线程来完成此操作。
我正在尝试使用 IntStream().parallel.forEach()
Java 1.8 功能,看起来我可以并行化嵌套for()
使用尽可能多的线程循环。
我担心的是:我的代码是可以使用所有十二个线程还是一个内核上的两个线程?
要了解您的机器可以使用多少个处理器,您可以使用 availableProcessors()
,摘自 java 文档的片段:
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
代码:
public class CoresDemo {
public static void main(String[] args) {
int nCores = Runtime.getRuntime().availableProcessors();
System.out.println(nCores);
}
}
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()));
我正在使用配备 Intel Core i5 处理器的 PC,据报道它有 12 个处理器,我认为它由 6 个内核组成,每个内核有两个线程。
我做了一些研究,Java 似乎使用了内核线程。我需要显着提高现有 Java 程序的性能,并希望我可以使用全部 12 个核心 i5 线程来完成此操作。
我正在尝试使用 IntStream().parallel.forEach()
Java 1.8 功能,看起来我可以并行化嵌套for()
使用尽可能多的线程循环。
我担心的是:我的代码是可以使用所有十二个线程还是一个内核上的两个线程?
要了解您的机器可以使用多少个处理器,您可以使用 availableProcessors()
,摘自 java 文档的片段:
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
代码:
public class CoresDemo {
public static void main(String[] args) {
int nCores = Runtime.getRuntime().availableProcessors();
System.out.println(nCores);
}
}
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()));