Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

1.18 多核CPU不一定比单核CPU运行快

CPU在线程上进行上下文切换的时间成本非常高。当多线程在执行计算密集型任务时,比如类似while(true){}这样的任务,则多核CPU的执行效率反而会慢一些。因为多核CPU需要处理内存中的共享数据以及多核CPU之间的通信和任务的调度等,而单核CPU在执行这种计算密集型任务时相当“专注”,没有多余的操作需要处理,所以执行效率反而快了。

可以在虚拟机软件中指定使用的CPU的核心数量。

创建测试项目one_more_core_diff。运行类代码如下:


package test;

import java.util.concurrent.atomic.AtomicLong;

class MyThread extends Thread {
    public void run() {
        long beginTime = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            double doubleNum = Math.random() + Math.random() + Math.random() + 
                Math.random() + Math.random()
                    + Math.random();
        }
        long endTime = System.currentTimeMillis();
        long useTime = endTime - beginTime;
        Test1.mylong.addAndGet(useTime);
    }
}

public class Test1 {
    public static AtomicLong mylong = new AtomicLong(0);

    public static void main(String[] args) throws InterruptedException {
        MyThread[] threadArray = new MyThread[10];
        for (int i = 0; i < threadArray.length; i++) {
            threadArray[i] = new MyThread();
            threadArray[i].start();
        }
        for (int i = 0; i < threadArray.length; i++) {
            threadArray[i].join();
        }
        System.out.println("耗时:" + mylong.get() + "毫秒");
    }
}

单核CPU运行环境的耗时如图1-76所示。

图1-76 单核CPU运行耗时

图1-77 多核CPU运行耗时

多核CPU运行环境的耗时如图1-77所示。

出现上下文切换的时机可以是CPU时间片使用结束,有更高优先级的线程等待执行,出现垃圾回收,调用了sleep、join、yield、wait、synchronized等操作。当出现上下文切换时需要记录当前线程的执行状态信息,以便在未来继续执行时根据此状态信息进行恢复,而记录线程运行状态信息非常占用CPU资源,导致运行效率降低。