2016-05-06 4 views
-3

私はスレッド結合でクエリを持っています。クエリスレッドがそれ以上のスレッドが、私はone.startThread#joinは 'join'ステートメントの後に続くすべてのスレッドを一時停止しますか?

One one = new One(); 
Two two = new Two(); 
Three three = new Three(); 
Four four = new Four(); 

one.start(); 
one.join(); // join placed after one.start 
two.start(); 
three.start(); 
four.start(); 
後one.join を配置している以下のコードでは、正常

完了されるまでに参加した後、以下のすべてのスレッドが一時停止されることを意味し参加するかどうかであります

私は以下のような結果を得ています。これは、スレッド1が完了するまで、2,3,4スレッドをブロックすることを示しています。

まず0
まず1
まず2
まず3
まず4
第0
第0
四0
第1
四1
第1
第2の2
第2
第四に2
第二3
第四に3
第3
第二4
第四4
第4

今すぐ下記のコードでは、私はtwo.start()one.join()置かれています

One one = new One(); 
Two two = new Two(); 
Three three = new Three(); 
Four four = new Four(); 

one.start(); 
two.start(); 
one.join(); // join placed after two.start 
three.start(); 
four.start(); 

a nd以下のような結果が得られました。これは、1つのスレッドと2つのスレッドが完了するまで、スレッドが3つと4つのスレッドをブロックすることを示します。

まず0
第0
まず1
第1
第2
まず2
第3
まず3
第4
まず4
四0
第三者0
第1
四1
第2
四2
第3
四3
第4
四4

+5

いいえ 'join'は他のスレッドをブロックせず、' join'を呼び出したスレッドのみをブロックします。メインスレッド自体がブロックされているため、コードでは他のスレッドを開始できません。 – Tom

+0

@Tomなぜ私は 'one.join()'を間違って配置したのですか? –

+0

あなたのメインスレッドはブロックされていると私はすでに言っていました。だから、 'join'コールの前にすべてを実行することができ、すべてを実行できるようになるまで待たなければなりません。 – Tom

答えて

3

t.join()戻るスレッドtが死んでいます。それは、呼び出し元がjoin()呼び出しが返った後にメモリ内でスレッドが触れたすべてを見ることができることを保証していることを意味する、 "起こる"という関係を確立します。

これは、Javaプログラムで正しく使用するために、基本的にはt.join()について知る必要があります。


あなたが書いた場合は、この:何もしません

one.start(); 
one.join(); 
two.start(); 

参加の呼び出しがtwoをスレッドします。実際には、oneのいずれかをスレッドするには何もしません。これは発信者にのみ影響します。

Java文は順番に実行されます。上記は、3つのステートメントのシーケンスです。 one.start()スレッドを開始します。 one.join()は、そのスレッドが終了するのを待ちます。 two.start()は別のスレッドを開始します。

シーケンス内の前のステートメントが完了するまで、1つのステートメントを実行することはできません。したがってはone.join()が返されるまで実行できません。oneスレッドが終了するまで発生しません。その理由は、one.join()です。スレッドが終了するのを待ちます。

関連する問題