为什么线程可以在单核CPU上运行?

Wil*_*ill 4 java multithreading multiplexing

为了更好地理解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();
        }
    }
}    
Run Code Online (Sandbox Code Playgroud)

我们的想法是,如果我运行Thread.sleep(5000),并Thread.sleep(1000)相继在main主题,消费将是时间6 sec,但因为我使用的线程,它会只花5 sec多核CPU的机器上,并且它做到了.但我的问题是:

为什么结果仍然5 sec在单核CPU机器上?当然使用了线程,但它不仅仅是通过时分复用模拟线程吗?

我对时分复用的理解是:假设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秒?

我是基地吗?

das*_*ght 12

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

请注意,这仅适用于休眠(使用几乎为零的CPU),但不适用于做有用的工作:在这种情况下,单核非超线程CPU的时序确实是附加的.例如,如果一个线程需要进行5秒钟的数字运算,而另一个线程需要进行第二次数字运算,那么两个线程的总时间将为6秒.

  • 刚刚测试过,你是对的.如果任务是实际任务而不是睡眠,那么线程不会影响"单核非超线程CPU"所消耗的总时间,感谢帮助:) (2认同)