2010-12-02 5 views
2

私は複雑なJavaアプリケーションで直面している問題は、次のように述べています。メインスレッドは、サブスレッドが終了しないうちに処理が進まないということです。私はこのプログラムを実行すると、私はいつも(サイクルでは、独立して、どのように多くの手順)最初MyThreadからの出力を得るメインスレッドは、続行する前に別のスレッドが終了するのを待つ理由は何ですか?

public class ThreadTest { 

     static class MyThread extends Thread{ 
      public void run(){ 
       for(double i = 0; i<1; i+=0.01){ 
        System.out.println(Math.pow(Math.PI,Math.E)*100.0*i-234.0); 
       } 
      } 
     } 

     public static void main(String[] args){ 
      (new MyThread()).run(); 
      System.out.println("main thread"); 
     } 
    } 

、その後、私はからのメッセージを取得する:問題を例示したコードは以下のとおりですメインスレッド。スレッドを作成するという考え方は、非同期的にコードを実行することですが、ここでは明確に同期動作を観察します。何が欠けていますか?

ありがとうございます!

+2

あなたが好きな答えを見つけたら、それを受け入れるのは丁寧です。場合によっては、より良い回答が出てくるのを待つ価値がありますが、それはあなた次第です。 –

+0

もちろん、ありがとう!私はスタートと混同して実際に走った。 – Tim

+0

run()がまったく公開されていないのは混乱しています。実際には、スレッドはrunメソッドを持つべきではなく、Runnableを使用する必要があります。これは、IMHOのベストプラクティスです。 –

答えて

11

run()を呼び出すと、現在のスレッドでrun()メソッドが呼び出されます。別のオブジェクトに対して他のメソッドを呼び出したのと同じ方法で行います。

新しいスレッドでrun()を呼び出す場合は、そのスレッドでstart()を呼び出す必要があります。

は自分自身にこれを証明するために

new MyThread().start(); 

一つの方法デバッガでプログラムをステップ実行することを試してみてください、これは一つのスレッドだけが存在することを示すだろう。

+0

手掛かりはありませんが、スレッドの開始はwhileループでした。スレッドがwhileループで仕事をしたかったのです。しかし、どういうわけか、メインプログラムはwhileループをスキップし、プログラムが誤った結果を出すことになります。あなたの答えは私の一日を救った。 –

関連する問題