我有一个四核处理器,并且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;
}
}
答案 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? 的答案。