2013-02-10 46 views
1

我看到有趣的行爲。我這段代碼運行Java線程:在啓動後調用Thread對象的run()方法

public class ThreadsTest { 

    public static void main(String[] args) { 
     Runnable mr = new MyRunnable(); 
     Thread t1 = new Thread(mr); 
     Thread t2 = new Thread(mr); 
     t1.setName("first"); 
     t2.setName("second"); 
     t1.start(); 
     t2.start(); 
     t1.run(); 
    } 
} 

class MyRunnable implements Runnable { 
    public void run() { 
    for (int i=0; i < 2; i++) { 
     System.out.println("Running: " + Thread.currentThread().getName()); 
    } 
    } 
} 

我得到的輸出是:

Running: first 
Running: first 
Running: second 
Running: second 

我期待看到類似這樣的東西:

Running: first 
Running: first 
Running: second 
Running: second 
Running: main 
Running: main 

有誰知道爲什麼我不在我的輸出中的某處可以看到Running: main。謝謝。

+1

我不知道你爲什麼期望。你能解釋一下嗎? – AHungerArtist 2013-02-10 04:22:07

+1

對Thread對象調用run()方法't1.run()'應調用MyRunnable類中的run方法。它應該輸出當前正在運行的線程是主線程。對Thread對象調用run()方法的行爲與調用任何其他對象上的任何方法的行爲相同。我希望我的回答對你有意義。 – robonerd 2013-02-10 04:28:49

回答

8

這個解釋有點微妙。

Thread.run()方法的默認行爲被描述爲運行提供的Runnable(如果存在),否則什麼也不做。

微妙之處在於,當線程退出時,exit()方法會「積極」地清除參考字段以防止存儲泄漏。 (這裏是the source ... 720行。)看起來,當你在main中調用t1.run()時,線程退出了,所以這個調用是沒有操作的。

當然,輸出取決於main線程在子線程退出之前是否再次運行......這將取決於您的平臺;例如JVM和OS級別的線程調度程序執行的操作以及可用的內核數量。

+4

+1,但可能值得補充的是它可能*顯示'Running:main',具體取決於線程調度(可能還有代碼重新排序?不太清楚它的含義)。 – 2013-02-10 04:26:53

+0

Stephen C的解釋確實有道理。謝謝。 Brian Roach確實如此,你無法預測調度如何工作。我只是不明白爲什麼運行永遠不會執行。多謝你們。 – robonerd 2013-02-10 04:35:50

0

我剛剛在我的機器上運行了您的代碼,並在輸出中看到「Running:main」。

+0

相同: 運行:主要 運行:第二 運行:第一 運行:第二 運行:主要 運行:第一 – msangel 2013-02-10 04:24:03

+2

是...輸出將是依賴於平臺。看到我的答案。 – 2013-02-10 04:31:53

相關問題