2013-07-18 83 views
0

混亂,我竟然在Java領域非常初學者,目前正通過多線程概念關於多線程

我碰到一個程序,並有關於程序本身的某些疑慮。

以下是我的程序

public class SecondThreadDemo implements Runnable { 
    public void run() { 
     System.out.print(Thread.currentThread().getName()); 
    } 
} 

class B implements Runnable { 
    public void run() { 
     new SecondThreadDemo().run(); 
     new SecondThreadDemo().run(); 
     new Thread(new SecondThreadDemo(), "T3").run(); 
     new Thread(new SecondThreadDemo(), "T2").start(); 
     new SecondThreadDemo().run(); 
     new Thread(new SecondThreadDemo(), "T3").start(); 
    } 
} 

class C { 
    public static void main(String[] args) { 
     new Thread(new B(), "T1").start(); 
    } 
}.. 

現在我所期待的是下面的輸出

T1T1T1T1T3T3 

但它的到來就像

T1T1T1T1T2T3 

有人可以澄清輸出?

+1

有run'和'start'之間'的差。'Runnable'本身不是'Thread',所以它將與你的其他代碼一起執行(就像調用其他方法一樣)。在你的例子中,'start'安排一個可以'Runnable'運行的線程。也將有不同每次運行它的時候,它歸結爲如何線程的調度工作 – MadProgrammer

+0

@MadProgrammer的事情中唯一讓我困惑的是,爲什麼̶O̶P̶'̶s̶代碼̶'̶T̶2̶'̶兩次在輸出沒關係OP已經解決這個。將該評論轉換爲答案。 –

+0

抱歉,我輸入了錯誤的輸出。請糾正錯誤!請原諒我 –

回答

10

runstart之間的差異。

Runnable本身並不是Thread,因此它將與您的其他代碼(如調用任何其他方法)內聯執行。

start安排一個線程,在您的示例中,您的Runnable的線程可以是run

也會有差異每次運行它的時候,它會回落到怎樣的線程調度工作

例如,你的代碼做到這一點...

new SecondThreadDemo().run(); 
new SecondThreadDemo().run(); 
new Thread(new SecondThreadDemo(), "T3").run(); 
new Thread(new SecondThreadDemo(), "T2").start(); 
new SecondThreadDemo().run(); 
new Thread(new SecondThreadDemo(), "T3").start(); 

這(可能)輸出類似...

T1 (run) 
T1 (run) 
T1 (run) (cause I'm in T1's thread context) 
// Then it all depends...this MIGHT be the output... 
{T1} (run) 
{T2} (start) 
{T3} (start) 
+1

我猜你應該添加唯一保證的是'T1'將在最後一節中的'T3'前面打印。 –

+0

我在第3行感到困惑我在第3行---新線程(new SecondThreadDemo(),「T3」)。run();它應該打印T3爲什麼它給出輸出作爲T1即沒有得到我的頭感謝 –

+0

第三行是打印T3,因爲你已經調用了'run'。你所做的所有事情都被稱爲線程的運行方法,它將immeditaly委託給你的'Runnable''' run'方法。它實際上並沒有啓動一個新的線程...... – MadProgrammer

0

如果你調用start方法對線程Java中的一個新的線程將只產卵,這將在一個新的T執行寫在run方法的代碼hread。

但如果你直接調用線程或Runnable對象的run()方法,然後將它在執行的主線程不能在一個新的線程中執行。

0

new SecondThreadDemo().run(); - 簡單的函數調用所以T1爲正在運行的線程是T1

new SecondThreadDemo().run(); - 簡單的函數調用所以T1爲正在運行的線程是T1

new Thread(new SecondThreadDemo(), "T3").run(); - 簡單的函數調用所以T1爲正在運行的線程是T1

new Thread(new SecondThreadDemo(), "T2").start(); - 此時您正在創建一個名稱爲T2的線程並調用開始,這裏取決於它是否可以打印T2或者可能是下一行將被執行並在此線程打印之前打印T1 T2 T2

new SecondThreadDemo().run(); - T1簡單的函數調用

new Thread(new SecondThreadDemo(), "T3").start(); - T3如預期

所以該宏將會取決於JVM輸出可以是T1T1T1T1T2T3或者可以是T1T1T1T2T1T3