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秒.