多线程和CPU核心之间的关系

367 阅读2分钟

有什么关系?

CPU的线程指的是同一时间有多少个可以工作的,而操作系统的线程大致可以理解为一个任务能被多少个工作的同时完成。

简单理解的话可以这样,将CPU理解为一个工厂,而这个工厂有4个工人,每个工人可以同时做两份工作(4核心8线程CPU)然后我们使用Java创建了一个累加的任务,这时只有一个工人做这一份工作,理论上来说这个工人需要一直满负荷的工作他的其他7个线程都是空闲状态,这么大的一个工场只有一个工人在工作,效率当然会很低,理论上效率应该是八分之一。

这里编写一小段代码方便理解

public class MoreLine implements Runnable {

    private int count;

    @Override
    public void run() {
        while (true)
            this.count++;

    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new MoreLine());
        t1.start();

        // Thread t2 = new Thread(new MoreLine());
        // t2.start();

        // Thread t3 = new Thread(new MoreLine());
        // t3.start();

        // Thread t4 = new Thread(new MoreLine());
        // t4.start();

        // Thread t5 = new Thread(new MoreLine());
        // t5.start();

        // Thread t6 = new Thread(new MoreLine());
        // t6.start();

        // Thread t7 = new Thread(new MoreLine());
        // t7.start();

        // Thread t8 = new Thread(new MoreLine());
        // t8.start();
    }
}

这里创建了8个线程,但是被我注释掉了7个所以只有一个线程在工作。 然后我们看一下CPU的使用率

image.png

13%和我们想象的基本一致。 这样讲的话我让4个线程工作的话,CPU使用率就能达到50%左右。让我们在来看看。

public class MoreLine implements Runnable {

    private int count;

    @Override
    public void run() {
        while (true)
            this.count++;

    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new MoreLine());
        t1.start();

        Thread t2 = new Thread(new MoreLine());
        t2.start();

        Thread t3 = new Thread(new MoreLine());
        t3.start();

        Thread t4 = new Thread(new MoreLine());
        t4.start();

        // Thread t5 = new Thread(new MoreLine());
        // t5.start();

        // Thread t6 = new Thread(new MoreLine());
        // t6.start();

        // Thread t7 = new Thread(new MoreLine());
        // t7.start();

        // Thread t8 = new Thread(new MoreLine());
        // t8.start();
    }
}

image.png

因为我的虚拟处理器是8个所以最高是8个工人同时工作,也就是说8个线程就可以让我的CPU达到满负载的状态。

我将代码注释解除重新编译。

image.png

CPU使用率直线上升。