start()方法來啓動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。
通過調用Thread類的start()方法來啓動一個線程,這時此線程是處於就緒狀態,並沒有運行。然後通過此Thread類調用方法run()來完成其運行操作的,這裏方法run()稱爲線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程終止,而CPU再運行其它線程,
run()方法當作普通方法的方式調用,程序還是要順序執行,還是要等待run方法體執行完畢後纔可繼續執行下面的代碼。
而如果直接用Run方法,這只是調用一個方法而已,程序中依然只有主線程--這一個線程,其程序執行路徑還是隻有一條,這樣就沒有達到寫線程的目的。
示例:
<span style="font-family:Times New Roman;font-size:18px;color:#006600;">public class TestThread1 {
public static void main(String[]args) {
Runner1 r=new Runner1();
//這是方法調用,而不是開啓一個線程
//r.run();
//調用了Thread(Runnable target)方法。且父類對象變量指向子類對象。
Thread t=new Thread(r);
t.start();
for(int i=0;i<100;i++) {
System.out.println("進入Main Thread運行狀態");
System.out.println(i);
}
}
}
//實現了這個接口,jdk就知道這個類是一個線程
class Runner1 implements Runnable {
public void run() {
for(int i=0;i<100;i++) {
System.out.println("進入Runner1運行狀態");
System.out.println(i);
}
}
}</span>
Thread對象的run()方法在一種循環下,使線程一直運行,直到不滿足條件爲止,在你的main()裏創建並運行了一些線程,調用Thread類的start()方法將爲線程執行特殊的初始化的過程,來配置線程,然後由線程執行機制調用run()。如果你不調用start()線程就不會啓動。
因爲線程調度機制的行爲是不確定的,所以每次運行該程序都會有不同的結果,你可以把你的循環次數增多些,然後看看執行的結果,你會發現main()的線程和Thread t是交替運行的。
還有就是儘管線程的調度順序是不固定的,但是如果有很多線程被阻塞等待運行,調度程序將會讓優先級高的線程先執行,而優先級低的線程執行的頻率會低一些。
線程的啓動是比較複雜的,需要爲線程分配資源,它的START方法被調用時系統纔會爲線程分配資源。你上面調用線程的run方法只能算普通的方法調用一樣,得運行完run裏面的代碼整個程序才能往下進行,而如果調用start方法,線程和MAIN方法就會搶資源,打印的語句會交替出現。
以上內容整理自互聯網