0

これが私のコードです

public class ThreadLearn{
private static class Check implements Runnable{
    public void run(){

        System.out.printf("\nInCheck %s", Thread.currentThread().getName());
    }
}

public static void main(String[] args){

   Thread t;
   int i=0;
   while(i<2){
      t = new Thread(new GetData());
      t.start();
      System.out.printf("\n%s: ", t.getName());
      i++;
   }

}

}

出力は次のとおりです。

InRun Thread-0
Thread-0:
Thread-1:
InRun Thread-1

2 つの質問があります。

  1. 出力は

    InRun スレッド 0

    スレッド-0:

    InRun スレッド 1

    スレッド-1:

  2. が完了したら、実行されるt.start()のを待ってrun()から 2 番目のスレッドを作成しますか? 次のことをしたい場合はどうすればよいですか

    ふりがな(必須)

    新しいスレッド().start();

私の実行メソッドでは、スレッドが並行して達成したいすべてのことを実行できるため、1 つのスレッドが実行メソッドを完了してから 2 番目のスレッドを作成するのを待機しません。

ありがとう

4

3 に答える 3

6

出力は..ではありません。

いいえ。スレッドは互いに独立して実行されます。JVMとオペレーティングシステムは、どのスレッドがいつ実行されるかを決定します。一般に、2つのスレッドが実行される順序は予測できません。プログラムを再度実行すると、結果が異なることがよくあります。

完了したら、t.start()が実行されるのを待ってrun()から2番目のスレッドを作成しますか?

いいえ、待ちません。新しいスレッドのrun()メソッドは、スレッドのスケジュール方法に応じて、すぐに開始することも、後で開始することもできます。

于 2012-08-24T07:22:33.610 に答える
1

スレッドが開始されると、開始されます。そのため、2 つの System.out はほぼ同時に実行され、順序が変わることがあります。

例:

            ---- thread-0 prints out  
Main thread |--- Prints out ----------- Prints out
                                      |Thread-1 started, prints out

ご覧のとおり、ブランチはメイン コードとほぼ同時に実行され、実際に最初に出力される時間の間で変動します。

于 2012-08-24T07:23:42.707 に答える
0

同期メカニズムを提供していないため、どのスレッドが最初に実行されるかを確実に知る方法はありません。異なる実行では、おそらく他の順序があります。

于 2012-08-24T07:23:20.373 に答える