面試題。線程pingpong的輸出問題



第一種情況:
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都有可能


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM