单个java线程在mac上使用两个核心?

时间:2013-04-14 08:35:36

标签: java multithreading concurrency core

我已经阅读过,例如在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);
    }
}

2 个答案:

答案 0 :(得分:2)

Java线程可以一对一映射到内核线程,但事实并非如此。您的操作系统可以自由地将线程从一个核心交换到另一个核心。即使您只使用一个线程,JVM也可以使用多个内核。

也许您可以在这里找到更多信息: Why does a single threaded process execute on several processors/cores?

答案 1 :(得分:1)

您可以使用jstack命令查看线程行为。不要忘记Java还在后台创建了许多线程 - 例如GC线程,终结器,信号调度器等。

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