面試遇到兩次一下題:
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"); } }
注意t調用的方法。通過上網查資料和實際演示,總結如下:
如果是t.run(),運行很多次,結果都是pong ping。后來終於發現了關鍵點所在,線程對象t,調用的不是start()方法,而是run()方法。后來開斷點模式debug,發現調用run()方法,整個程序只有一個線程,而調用start()方法之后,程序就會多出一個線程。這時才有和主線程爭cpu,可能出現多種結果的情況,但由於下面輸出方法很快就被執行了,所以基本上都是“ping pong”的輸出。
所以run()和start()的區別就是:
run()是Runnable接口中定義的一個方法,是為了讓客戶程序員在這個方法里寫自己的功能代碼的。直接調用和普通的類調用自己的成員方法是沒有任何區別的。
而start()則是線程開始運行的標志,當這個方法被調用后,程序中才會多出一個獨立的線程,接着便是執行run()方法。