可调用代码不会在ThreadPoolExecutor中使用多个CPU

时间:2011-07-20 23:59:33

标签: java multithreading

我有一个四核处理器,并且ThreadPoolExecutor设置为4个核心线程,但是当我将我的callables(大约一百个)提交给ThreadPoolExecutor时,Java从不使用超过25%的CPU。为什么不使用所有这些?

有问题的代码:

static class Sum implements Callable{
    private double bigarray[];
    public Sum(double [] bigarray){
        this.bigarray = bigarray;
    }
    @Override
    public Double call(){
        double sum = 0;
        for (int i = 0; i < bigarray.length; i++){
            sum += bigarray[i];
        }
        return sum;
    }
}

2 个答案:

答案 0 :(得分:1)

您可以通过调用Runtime.getRuntime().availableProcessors()来尝试查看Java程序可用的CPU数量。您运行的平台可能限制您只使用一个CPU(例如,如果您在虚拟环境中运行程序)。

答案 1 :(得分:0)

通常,目前Java中没有用于控制核心和处理器亲和性的接口,因此您的代码(和线程)由操作系统调度,因为它找到了正确的。你可能不喜欢它。 正如所说 Running multiple threads on multiple CPU cores?

  

一般来说,这不是JVM的工作;它是分配的操作系统   作为一个线程的核心,JVM只是一个程序。如果你正在运行它   在MS Windows机器上,您可以尝试为其设置“亲和力”   JVM,即告诉调度程序(任务管理器)JVM的CPU(核心)   允许使用。

但我不认为这是一种可行的方式。

请参阅Stack Overflow问题 How does Java makes use of multiple cores? 的答案。