在講這個問題之前引入一下多線程的小知識吧
/*/windows系統中的應用程序來做說明 ,例如:掃雷程序,游戲進行的同時,可以同時記錄分數,計算時間等. 其實一個應用程序就是一個可執行文件,中包含了一個或者多個進程,一個或者多個進程中包含了一個或者多個線程.
public class Thread
extends Object
implements Runnable
線程 是程序中的執行線程。Java 虛擬機允許應用程序並發地運行多個執行線程。
每個線程都有一個優先級,高優先級線程的執行優先於低優先級線程。每個線程都可以或不可以標記為一個守護程序。當某個線程中運行的代碼創建一個新 Thread
對象時,該新線程的初始優先級被設定為創建線程的優先級,並且當且僅當創建線程是守護線程時,新線程才是守護程序。
當 Java 虛擬機啟動時,通常都會有單個非守護線程(它通常會調用某個指定類的 main
方法)。Java 虛擬機會繼續執行線程,直到下列任一情況出現時為止:
- 調用了
Runtime
類的exit
方法,並且安全管理器允許退出操作發生。 - 非守護線程的所有線程都已停止運行,無論是通過從對 run 方法的調用中返回,還是通過拋出一個傳播到
run
方法之外的異常。
額...走遠了走遠了
直接說吧
(1)start()方法是來自線程的,真正的實現了多線程的運行,而不用等到run()方法執行完畢之后再執行下面的代碼段
通過調用Thread類的start()方法來啟動一個線程,這時此線程是處於就緒狀態,並沒有運行。
然后通過此Thread類調用方法run()來完成其運行操作的,這里方法run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程終止,
而CPU再運行其它線程。
(2)而run()方法只是類中我們自己定義的方法,是一種普通的方法,順序執行,只有在執行完這一段代碼之后才會繼續執行下去
而如果直接用Run方法,這只是調用一個方法而已,程序中依然只有主線程--這一個線程,其程序執行路徑還是只有一條,這樣就沒有達到寫線程的目的。
下面舉了一個小例子
代碼段如下:
1 public class test_Run { 2 public static void main(String[] args) { 3 Runner1 r = new Runner1(); 4 // r.run();//這是方法調用,而不是開啟一個線程 5 Thread t = new Thread(r);// 調用了Thread(Runnable target)方法。且父類對象變量指向子類對象。 6 t.start(); 7 8 for (int i = 0; i < 100; i++) { 9 System.out.println("進入Main Thread運行狀態"); 10 System.out.println(i); 11 } 12 } 13 } 14 15 class Runner1 implements Runnable { // 實現了這個接口,jdk就知道這個類是一個線程 16 public void run() { 17 18 for (int i = 0; i < 100; i++) { 19 System.out.println("進入Runner1運行狀態"); 20 System.out.println(i); 21 } 22 } 23 }