4

为了更好地理解 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();
        }
    }
}    

这个想法是,如果我在 Thread 中按顺序运行,所消耗的Thread.sleep(5000)时间将为 但我的问题是:Thread.sleep(1000)main6 sec5 sec

为什么结果还在5 sec单核CPU机器上?当然使用了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 秒?

我是这里的基地吗?

4

2 回答 2

12

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

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

于 2013-05-16T15:24:34.980 回答
1

通过调用 Thread.sleep(sleeptime),线程发出信号,它至少在“睡眠时间”毫秒内不需要 CPU。

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

于 2013-05-16T15:25:33.010 回答