啓動一個線程是用run()還是start()? 爲什麼?

轉自:http://blog.csdn.net/xieping1990/article/details/6433046

啓動線程肯定要用start()方法。當用start()開始一個線程後,線程就進入就緒狀態,使線程所代表的虛擬處理機處於可運行狀態,這意味着它可以由JVM調度並執行。這並不意味着線程就會立即運行。當cpu分配給它時間時,纔開始執行run()方法(如果有的話)。start()是方法,它調用run()方法.而run()方法是你必須重寫的. run()方法中包含的是線程的主體。 
繼承Thread類的啓動方式: 

public class ThreadStartTest { 
    public static void main(String[] args) { 
        ThreadTest tt = new ThreadTest();// 創建一個線程實例 
         tt.start();  // 啓動線程 
    } 
} 
實現Runnable接口的啓動方式: 
public class RunnableStartTest { 
    public static void main(String[] args) { 
       Thread t = new Thread(new RunnableTest());    // 創建一個線程實例 
        t.start();  // 啓動線程 
    } 
} 
實際上這兩種啓動線程的方式原理是一樣的。首先都是調用本地方法啓動一個線程,其次是在這個線程裏執行目標對象的run()方法。那麼這個目標對象是什麼呢?爲了弄明白這個問題,我們來看看Thread類的run()方法的實現: 
public void run() { 
    if (target != null) { 
        target.run(); 
    } 
} 
當我們採用實現Runnable接口的方式來實現線程的情況下,在調用new Thread(Runnable target)構造器時,將實現Runnable接口的類的實例設置成了線程要執行的主體所屬的目標對象target,當線程啓動時,這個實例的 run()方法就被執行了。當我們採用繼承Thread的方式實現線程時,線程的這個run()方法被重寫了,所以當線程啓動時,執行的是這個對象自身的 run()方法。總結起來就一句話,如果我們採用的是繼承Thread類的方式,那麼這個target就是線程對象自身,如果我們採用的是實現Runnable接口的方式,那麼這個target就是實現了Runnable接口的類的實例。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章