線程直接調用run()方法而不是start()方法
如果直接調用run()
方法而不是start()
方法會怎麼樣?
每個線程在一個單獨的調用堆棧中啓動。
從主線程調用run()
方法,run()
方法進入當前調用堆棧而不是新調用堆棧的開頭。
參考示例代碼:
package com.yiibai;
class TestCallRun1 extends Thread {
public void run() {
System.out.println("running...");
}
public static void main(String args[]) {
TestCallRun1 t1 = new TestCallRun1();
t1.run();// fine, but does not start a separate call stack
}
}
執行上面示例代碼,得到以下結果:
running...
如果直接調用run()
方法,則會出現問題。參考以下示例代碼:
package com.yiibai;
class TestCallRun2 extends Thread {
public void run() {
for (int i = 1; i < 5; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println(e);
}
System.out.println(i);
}
}
public static void main(String args[]) {
TestCallRun2 t1 = new TestCallRun2();
TestCallRun2 t2 = new TestCallRun2();
t1.run();
t2.run();
}
}
執行上面示例代碼,得到以下結果:
1
2
3
4
1
2
3
4
正如在上面的程序中看到的那樣,程序執行並沒有上下文切換,因爲這裏t1
和t2
將被視爲普通對象而不是線程對象。