執行緒直接呼叫run()方法而不是start()方法


如果直接呼叫run()方法而不是start()方法會怎麼樣?

每個執行緒在一個單獨的呼叫堆疊中啟動。
從主執行緒呼叫run()方法,run()方法進入當前呼叫堆疊而不是新呼叫堆疊的開頭。

參考範例程式碼:

package com.yiibai;

class TestCallRun1 extends Thread {
    public void run() {
        System.out.println("running...");
    }

    public static void main(String args[]) {
        TestCallRun1 t1 = new TestCallRun1();
        t1.run();// fine, but does not start a separate call stack
    }
}

執行上面範例程式碼,得到以下結果:

running...

如果直接呼叫run()方法,則會出現問題。參考以下範例程式碼:

package com.yiibai;

class TestCallRun2 extends Thread {
    public void run() {
        for (int i = 1; i < 5; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                System.out.println(e);
            }
            System.out.println(i);
        }
    }

    public static void main(String args[]) {
        TestCallRun2 t1 = new TestCallRun2();
        TestCallRun2 t2 = new TestCallRun2();

        t1.run();
        t2.run();
    }
}

執行上面範例程式碼,得到以下結果:

1
2
3
4
1
2
3
4

正如在上面的程式中看到的那樣,程式執行並沒有上下文切換,因為這裡t1t2將被視為普通物件而不是執行緒物件。