为啥线程在单核 CPU 上工作?

Posted

技术标签:

【中文标题】为啥线程在单核 CPU 上工作?【英文标题】:Why is threading works on a single core CPU?为什么线程在单核 CPU 上工作? 【发布时间】:2013-05-11 13:59:32 【问题描述】:

为了更好地理解 Java 中的线程,我编写了以下代码

public class SimpleRunnableTest 
   public static void main(String[] args) throws InterruptedException 
       long start = System.currentTimeMillis();

       Thread t1 = new Thread(new TT1());
       t1.start();
       Thread t2 = new Thread(new TT2());
       t2.start();

       t2.join();
       t1.join();

       long end = System.currentTimeMillis();
       System.out.println("end-start="+(end-start));
       

class TT1 implements Runnable 
    public void run()
        try 
            Thread.sleep(5000);
         catch (InterruptedException e) 
            e.printStackTrace();
        
    


class TT2 implements Runnable 
    public void run() 
        try 
            Thread.sleep(1000);
         catch (InterruptedException e) 
            e.printStackTrace();
        
    
    

这个想法是,如果我在main 线程中顺序运行Thread.sleep(5000)Thread.sleep(1000),所消耗的时间将是6 sec,但由于我使用的是线程,所以在多核 CPU 上它只会花费5 sec机器,它做到了。但我的问题是:

为什么单核CPU机器上的结果还是5 sec?当然使用了Threading,但不就是时分复用模拟线程吗?

我对时分复用的理解是:假设Thread.sleep(5000)是任务A,Thread.sleep(1000)是任务B,我们可以把它拆成:A1、A2、A3; B1、B2

顺序就是:A1、A2、A3、B1、B2

时分复用线程就是:A1、B1、A2、B2、A3

如果是,为什么第一个需要 6 秒,而第二个只有 5 秒?

我是这里的基地吗?

【问题讨论】:

一个进入睡眠状态,发生线程上下文切换,然后另一个执行(也进入睡眠状态)。 线程实现取决于系统构建器,在一个系统上它是绿色的,在另一个系统上是紫色的。你更喜欢哪个? 【参考方案1】:

通过调用 Thread.sleep(sleeptime),线程发出信号,表明它至少在 'sleeptime' 毫秒内不需要 CPU。

同时可以执行另一个线程。

【讨论】:

但他们真的睡不着at the same time,对吧?在 CPU 级别上,same time 是由time division multiplexing 实现的,这意味着真正发生的情况是 A 休眠一段时间,然后 B,然后 A,然后 B... 因为时间间隔对于每个线程都会产生sleeping at the same time 的错觉,这不是首先在单核CPU 上实现多线程的方式吗?因为无论如何,一个 CPU 不能一次执行多个命令,对吧? "sleep" 这里是“什么都不做”的同义词——两个线程应该防止什么并行不做?此外,当前具有流水线和预测功能的 CPU 设计可以并行执行很多操作,即使在单核上也是如此【参考方案2】:

结果是 5,而不是 6,因为两个线程可以同时休眠。通过调用 Thread.sleep() 进入睡眠状态让另一个线程运行,但剩余的睡眠间隔计时器继续为两个线程计时。

请注意,这仅适用于睡眠(使用几乎为零的 CPU),但不适用于做有用的工作:在这种情况下,单核非超线程 CPU 上的计时确实会增加。例如,如果一个线程需要进行 5 秒的数字运算,而另一个需要进行 1 秒的数字运算,则两个线程的总时间将是 6 秒。

【讨论】:

刚刚测试,你是对的。如果任务是实际任务而不是睡眠,线程不会影响 single-core non-hyperthreaded CPU 上消耗的总时间,感谢您的帮助:)

以上是关于为啥线程在单核 CPU 上工作?的主要内容,如果未能解决你的问题,请参考以下文章

python 多线程与GIL

“多个单核CPU”与“单个多核CPU”哪种方式性能较强?

线程数,射多少最合理?

多线程和CPU的关系

单核CPU如何执行多线程

Java多线程