1

例如,在 Java Concurrency in Practice 中,我读过“只有一个线程的程序一次最多可以在一个处理器上运行”。

但是,如果我在我的 2.5 GHz Intel Core 2 Duo Macbook Pro 上运行单线程 Java 类,我可以看到(在 Activity Monitor 中)两个内核的 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);
    }
}
4

2 回答 2

2

Java 线程可以一对一地映射到内核线程,但并非必须如此。您的操作系统可以无缘无故地将线程从一个内核交换到另一个内核。即使您只使用一个线程,JVM 也可以使用多个内核。

也许您可以在这里找到更多信息: 为什么单线程进程在多个处理器/内核上执行?

于 2013-04-14T08:45:51.257 回答
1

您可以使用 jstack 命令查看线程行为。不要忘记 Java 也在后台创建了许多线程——主要的例子是 GC 线程、终结器、信号调度器等。

在我的 Mac 上,它显示大约 8 个线程 - 您的里程可能会有所不同。操作系统和 JDK 实现可以自由地将线程调度到他们想要的位置!

于 2013-04-14T08:47:40.570 回答