(一)Thread的run() 和 start() 方法

Java多線程在實際開發中會遇到不少問題,對於這種爭搶CPU時間片斷的選手,咱們或許有不少困惑,捉摸不透。即使如此,它也是能夠被咱們控制的。多線程

最近在看Java多線程的書籍,裏面有好多我曾經不怎麼注意的問題和細節,今天就來和你們分享一下下jvm

我建立了一個類,寫了main方法,以下ide

public class Demo1 {

    public static void main(String[] args){
        Thread t = new MyThread();
        t.start();
        t.run();
    }
}

class MyThread extends Thread{
    /*
    這是被主線程調用的,即main
     */
    public MyThread(){
        System.out.println("run方法的打印1:" + Thread.currentThread().getName());
    }

    /*
    這是被子線程調用,也就是說主線程調用一切子線程,因此構造器裏的方法會先執行。同時咱們也要理解,
    當一個方法啓動時,至少啓動兩個線程,一個是main,一個是GC(垃圾回收器)
    run方法自己是被main函數調用的
     */
    @Override
    public void run() {
        System.out.println("run方法的打印2:" + Thread.currentThread().getName());

    }
}

而後運行,控制檯打印結果爲函數

在這裏,我忽然想到了一個疑問,run和start到底有什麼區別?spa

我查找了一些資料,解答是這樣的,我也比較承認。線程

1) start:
  用start方法來啓動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。經過調用Thread類的start()方法來啓動一個線程,這時此線程處於就緒(可運行)狀態,並無運行,一旦獲得cpu時間片,就開始執行run()方法,這裏方法 run()稱爲線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。
2) run:
  run()方法只是類的一個普通方法而已,若是直接調用Run方法,程序中依然只有主線程這一個線程,其程序執行路徑仍是隻有一條,仍是要順序執行,仍是要等待run方法體執行完畢後纔可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。總結:調用start方法方可啓動線程,而run方法只是thread的一個普通方法調用,仍是在主線程裏執行。這兩個方法應該都比較熟悉,把須要並行處理的代碼放在run()方法中,start()方法啓動線程將自動調用 run()方法,這是由jvm的內存機制規定的。code

相關文章
相關標籤/搜索