2

Thread join() メソッドについて調査していたところ、stackoverflow に関するThreadJoinMethodの投稿に出会いました。実際の例を開発するためにコードを変更しましたが、出力に混乱しています。コードスニペットは.

class JoinRunnable implements Runnable{

  public void run() {
    for(int i =0 ; i < 4 ; i++){
      System.out.println(i);
    }
  }
}
public class TestJoin{
  public static void main(String[] args) throws InterruptedException {
    JoinRunnable joinRunnable = new JoinRunnable();
    Thread t1 = new Thread(joinRunnable);
    Thread t2 = new Thread(joinRunnable);
    t1.start();
    t2.start();
    System.out.println("Currently running thread: " + Thread.currentThread().getName());
    t1.join();
    t2.join();
    System.out.println("I must wait");
  }
}

次のプログラムの出力は次のとおりです。

0
1
2
3
0
1
2
3
Currently running thread: main
I must wait

私は出力で混乱しています。現在のスレッドはjoinon t1 および t2 の呼び出し後に結合されますが、t1 および t2 の完了後にステートメント"Currently Running Thread: main"が印刷されるのはなぜですか? ここでいくつかの重要な概念が欠けていますか? main() は、前ではなく結合ステートメントの後に t1 と t2 を結合するためです。誰かがそれについて詳しく説明できますか?

4

6 に答える 6

4

呼び出した後にスレッドが開始されます。start() これは、スレッドがその後に続く行の前に開始でき、その後に続く行の前に完了することさえできることを意味します。

于 2013-08-07T13:49:22.367 に答える
2

あなたはそれを間違った方法で解釈しています。join()メソッドにより、mainスレッドは および を待機しt1ますt2。そのため、 andmainの完了前に終了しません。そして、主にスレッドの優先度に応じて、最初に何を出力するかは完全に任意です。定義済みの動作を設定するには、スレッドを同期する必要があります。t1t2

于 2013-08-07T13:50:26.610 に答える
2

System.out.println基礎となるインスタンスで同期されます(少なくとも、ここで私のPCにある実装では)。OutputStream

それぞれの時間間隔printlnは非常に短いため、println別のスレッドからの a が実行される可能性はほとんどありません。

printlnそのため、 (少なくとも非常に高い確率で) に特定の順序があるように見えます。いくつかのスリープを挿入し、ループのカウントを高くすると、別の動作を観察できるはずです。

于 2013-08-07T13:57:16.793 に答える
1

これは実行速度が速すぎます。これら 2 つのスレッドに短いスリープを挿入します。

于 2013-08-07T13:49:52.203 に答える
1

スレッド t1 と t2 は、ステートメントの前に作業を開始および終了しました

 System.out.println("Currently running thread: " + Thread.currentThread().getName());

実際に画面上に任意の出力を生成できます。したがって、スレッド t1 と t2 はタスクを完了し、メイン スレッドは、それに参加しているスレッドが run() メソッドで実行されると、次に進むことができます。

2 つのスレッドの結合の概念を学び、理解したい場合は、実行メソッドの for ループに Thread.sleep(1000) を提供してください。

于 2013-08-07T14:07:19.703 に答える
1

join()メソッドの説明は次のとおりです:
Blocks the current Thread (Thread.currentThread()) until the receiver finishes its execution and dies.(javadoc から)
実際、t1 と t2 が停止するのを待っているメイン スレッドをブロックすることができます。

于 2013-08-07T13:52:35.947 に答える