爲了更好地理解線程在Java中,我寫了下面的代碼爲什麼線程工作在單核CPU上?
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.sleep(5000)
和Thread.sleep(1000)
依次main
線程,所消耗的時間會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秒?
我在這裏的基地嗎?
一旦進入休眠狀態,就會發生線程上下文切換,然後另一個執行(也將進入休眠狀態)。 –
線程的實現取決於系統構建器,一個系統是綠色的,另一個是紫色的。你更喜歡哪個? –