2016-05-18 108 views
2

爲什麼類A的線程等待,直到類B的線程結束? 在此示例中,代碼打印System.out.println從不執行。 我該如何解決這個問題?Java:多線程

public class A implements Runnable { 
    public A() { 
     Thread t = new Thread(this); 
     t.start(); 

    } 
    public static void main(String[] args) { 
     A tmp = new A(); 
    } 
    public void run() { 

     B tmp = new B(); 
     tmp.run(); 

     System.out.println("Hello"); 
    } 
} 
class B implements Runnable { 
    public B() { 
    } 
    public void run() { 
     while (true) { 
     } 
    } 
} 
+0

爲什麼你要啓動線程A調用啓動方法,但線程B調用運行? –

回答

3
tmp.run(); 

在主線程中運行,而不是單獨的Thread因爲你還沒有開始B中一個單獨的線程。

上面的行應與

new Thread(tmp).start(); 

已啓動線程A正確(通過使用start()方法)來代替,並沒有複製線程B.

參考Oracle文檔鏈接相同大約兩個ways啓動線程:

  1. 提供一個Runnable對象:Runnable INT erface定義了一個單獨的方法run,它意味着包含在線程中執行的代碼。
  2. 子類Thread: Thread類本身實現了Runnable,儘管它的run方法什麼都不做。一個應用程序可以繼承Thread,提供自己的運行實現

在不同的筆記中,您的線程B運行在無限循環中,並且沒有退出條件。如果無意,請在run()方法中添加退出條件。

0

這段代碼:

B tmp = new B(); 
tmp.run(); 

System.out.println("Hello"); 

不啓動一個線程。只有一個線程產生,它調用b.run()。所以線程a簡單地掛在無盡循環b.run()。只要創建另一個線程的可運行'B」,一切都應該按預期工作:

public void run() { 

    Thread t = new Thread(new B()); 
    t.start(); 

    System.out.println("Hello"); 
} 
+0

短語「不啓動線程」有點令人誤解。 runnable在主線程中運行,而不是單獨運行一個 – mangusta

+0

@mangusta這會導致什麼誤解?你只是自己說過:代碼不會啓動一個新線程,而是直接在主線程中執行 – Paul