在講這個問題以前引入一下多線程的小知識吧html
/*/windows系統中的應用程序來作說明 ,例如:掃雷程序,遊戲進行的同時,能夠同時記錄分數,計算時間等. 其實一個應用程序就是一個可執行文件,中包含了一個或者多個進程,一個或者多個進程中包含了一個或者多個線程.java
public class Thread
extends Object
implements Runnable
線程 是程序中的執行線程。Java 虛擬機容許應用程序併發地運行多個執行線程。windows
每一個線程都有一個優先級,高優先級線程的執行優先於低優先級線程。每一個線程均可以或不能夠標記爲一個守護程序。當某個線程中運行的代碼建立一個新 Thread
對象時,該新線程的初始優先級被設定爲建立線程的優先級,而且當且僅當建立線程是守護線程時,新線程纔是守護程序。安全
當 Java 虛擬機啓動時,一般都會有單個非守護線程(它一般會調用某個指定類的 main
方法)。Java 虛擬機會繼續執行線程,直到下列任一狀況出現時爲止:多線程
Runtime
類的 exit
方法,而且安全管理器容許退出操做發生。run
方法以外的異常。
額...走遠了走遠了併發
直接說吧spa
(1)start()方法是來自線程的,真正的實現了多線程的運行,而不用等到run()方法執行完畢以後再執行下面的代碼段線程
經過調用Thread類的start()方法來啓動一個線程,這時此線程是處於就緒狀態,並無運行。
而後經過此Thread類調用方法run()來完成其運行操做的,這裏方法run()稱爲線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程終止,
而CPU再運行其它線程。
code
(2)而run()方法只是類中咱們本身定義的方法,是一種普通的方法,順序執行,只有在執行完這一段代碼以後纔會繼續執行下去htm
而若是直接用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 }