2016-05-18 6 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はstartメソッドを呼び出しますが、スレッドBは実行を呼び出しますか? –

答えて

3
tmp.run(); 

実行されます。線の上

は、あなたが(start()メソッドを使用して)適切にスレッドを開始している

new Thread(tmp).start(); 

に置き換えるべきと

は、Oracleのドキュメントのリンクを参照してくださいスレッドBの同じレプリケートされませんでした2 waysでスレッドを開始について:Runnable INT:

  1. はRunnableオブジェクトを提供しますerfaceはスレッド内で実行されるコードを格納するためのrunという単一のメソッドを定義します。
  2. サブクラススレッド: Threadクラス自体はRunnableを実装していますが、runメソッドは何もしません。アプリケーションはスレッドをサブクラス化して、独自の実行を提供することができます

スレッドBは無限ループで実行され、終了条件はありません。意図していない場合は、run()メソッドに終了条件を追加します。

0

コードのこの作品:

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

System.out.println("Hello"); 

は、スレッドを起動しません。スレッドが1つしか生成されておらず、b.run()が呼び出されます。だからスレッドaは無限ループで単にb.run()にハングアップします。ただ、実行可能な `B」のための別のスレッドを作成し、すべてが期待どおりに動作するはずです:あなたは別のスレッドとしてBを開始していないので、代わりに別のThreadのメインスレッドで

public void run() { 

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

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

"スレッドを開始しない"というフレーズは少し誤解を招く。実行可能ファイルは別のスレッドではなくメインスレッドで実行されます – mangusta

+0

@mangustaこれについては誤解を招くでしょうか?あなたはちょうどそれを自分で言った:コードは新しいスレッドを開始しないが、メインスレッドで直接実行する – Paul