Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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_Parallel Processing_Java 8_Java Stream - Fatal编程技术网

Java-使用多个CPU的非并行代码

Java-使用多个CPU的非并行代码,java,parallel-processing,java-8,java-stream,Java,Parallel Processing,Java 8,Java Stream,下面的代码是非并行的。在监视资源监视器时,我会看到我的所有内核都会均匀地分配任务 import java.math.*; import java.util.stream.*; public class Main { public static BigInteger factorial(int number) { if(number <= 1) { return BigInteger.valueOf(1); }

下面的代码是非并行的。在监视资源监视器时,我会看到我的所有内核都会均匀地分配任务

import java.math.*;
import java.util.stream.*;

public class Main {
    public static BigInteger factorial(int number) {
        if(number <= 1) {
            return BigInteger.valueOf(1);
        }
        return BigInteger.valueOf(number).multiply(factorial(number-1));
    }

    public static void main(String[] args){
        IntStream.range(1, 5000).forEach(Main::factorial);
    }
}
致:


再一次,我会看到所有的核心都被使用(只有这一次,我所有的核心都有100%的使用率)。我可以解释由于我的处理器来自石器时代(Core 2 Quad),所以不存在内核的上限,但我无法解释顺序任务如何也使用多个内核。

它可以是应用程序(在JVM中)运行的任何守护进程线程,例如垃圾收集器。它在单独的线程中运行,并清理未使用的对象。所以GC在不同的线程中工作,并消耗您的CPU


因此,即使您有单线程应用程序,java也会在不同的线程中启动一些在后台工作的服务。

顺序计算是在单个操作系统线程中执行的,但操作系统线程并不绑定到特定的CPU核,操作系统可能会决定将线程从一个核移动到另一个核(所谓的线程迁移)。您可以将线程或进程绑定到设置线程亲缘关系的特定核心(这取决于您使用的操作系统)。

当我查看资源监视器时,每个线程在所有CPU上的使用率似乎都是“相等的”(每个线程在同一时间被加峰值,每个线程被升级..等等)。看起来并不是线程从一个内核移动到另一个内核,而是工作负载均匀分布。@Rockyx123:看起来是这样的,因为资源监视器的采样频率低于操作系统对内核的重新分配。
IntStream.range(1, 5000).forEach(Main::factorial);
IntStream.range(1, 5000).parallel().forEach(Main::factorial);