我已经阅读过,例如在Java Concurrency in Practice中,“只有一个线程的程序一次最多可以在一个处理器上运行。”
但是,如果我在2.5 GHz Intel Core 2 Duo Macbook Pro上运行单线程java类,我可以看到(在活动监视器中)两个内核的CPU使用率从接近0上升到60%左右。
mac OS是否以某种方式将我的线程从一个核心切换到另一个核心,如果是,为什么?
谢谢!这是代码..
public class PrimeCalculator {
public static void findPrimes (int start, int end){
int countPrimes = 0;
for (int i=start; i<end; i++){
if (i % 1000000 == 0){
System.out.println("Did a million..");
}
boolean found = true;
for (int check = 2; check <= Math.sqrt(i); check++){
if (i % check == 0){
found = false;
break;
}
}
if (found == true){
//System.out.println(i);
countPrimes++;
}
}
System.out.println("I counted "+countPrimes+" primes");
}
public static void main(String[] args){
findPrimes(0,100000000);
}
}
答案 0 :(得分:2)
Java线程可以一对一映射到内核线程,但事实并非如此。您的操作系统可以自由地将线程从一个核心交换到另一个核心。即使您只使用一个线程,JVM也可以使用多个内核。
也许您可以在这里找到更多信息: Why does a single threaded process execute on several processors/cores?
答案 1 :(得分:1)
您可以使用jstack命令查看线程行为。不要忘记Java还在后台创建了许多线程 - 例如GC线程,终结器,信号调度器等。
在我的Mac上它显示大约8个线程 - 您的里程可能会有所不同。操作系统和JDK实现可以自由地安排线程以及他们想要的位置!