第一種情況:
public class Main { public static void main(String args[]) { Thread t = new Thread() { public void run() { pong(); } }; t.run(); System.out.println("ping"); } static void pong() { System.out.println("pong"); } }
輸出:pingpong 解釋:調用run()方法,整個程序只有一個線程,主線程,run()是Runnable接口中定義的一個方法,是為了讓客戶程序員在這個方法里寫自己的功能代碼的。直接調用和普通的類調用自己的成員方法是沒有任何區別的。
第二種情況
public static void main(String args[]) { Thread t = new Thread() { public void run() { pong(); } }; t.start(); System.out.println("ping"); } static void pong() { System.out.println("pong"); } }
輸出:pongping,解釋:用start()方法之后,程序就會多出一個線程,設定新線程進入 “就緒” 狀態,等待 CPU 調度之后才會執行
這時才有和主線程爭cpu。
而下一個 System.out.print() 幾乎(概率大於99%)可以認為是立即接着執行的。
所以,最終效果就是,幾乎都是 pongping。
第三種情況
public class Test02 {
public static void main(String args[]) throws InterruptedException {
Thread mThread = Thread.currentThread();
Thread t = new Thread() {
public void run() {
try {
Thread.sleep(250);// 1. 這句話注釋掉和不注釋掉的區別,或者更改sleep里面時間的區別
} catch (InterruptedException e) {
e.printStackTrace();
}
pong();
}
};
t.start();// 換成t.run(),觀察不同一般在筆試題中是陷阱,混淆start
mThread.sleep(250);// 2. 這句話注釋掉和不注釋掉的區別,或者更改sleep里面時間的區別
System.out.println("ping");
}
static void pong() {
System.out.println("pong");
}
}
輸出pingpong和pongping都有可能