参加することは文字通り参加を意味します。結合方法の説明と実装を見てみましょう。
/***このスレッドが死ぬのを待ちます。 *発信者スレッド(結合メソッドを呼び出すスレッド)は、呼び出されたスレッド(結合メソッドが属するスレッド)が終了し、再び目が覚めるまで待機操作を実行します * <p>このメソッドの呼び出しは、invocation * * * * @throws interrupedexception *とまったく同じ方法で動作します。現在のスレッドの * <i>中断されたステータス</i>は、この例外がスローされたときにクリアされます。 */ public final void join()throws arturtedexception {join(0); }ここで結合が呼ばれます
/** *このスレッドが *死ぬまで、最大で{@code millis}何百万秒も待ちます。 {@code 0}のタイムアウトは、スレッドの実行が終了するのを待つこと、または指定された最大待機時間が到着することを意味します。発信者のスレッドは再び目覚めます。最大待機時間が0の場合、目覚める前にスレッドの実行が終了するのを待つことしかできません。 * <p>この実装では、{@code this.wait}呼び出しのループが{@code this.isalive}に条件付けられています。スレッドが終了すると、 * {@code this.notifyall}メソッドが呼び出されます。 *アプリケーションは{@code wait}、{@code notify}、または * {@code notifyall}を{@codeスレッド}インスタンスで使用しないことをお勧めします。 * * */ public final synchronized void join(long millis)throws arturnedexception {long base = system.currenttimemillis();長い= 0; if(millis <0){新しいIllegalargumentException( "Timeout値は負"); } if(millis == 0){while(isalive()){wait(0); }} else {while(isalive()){long delay = millis -now; if(delay <= 0){break; } wait(delay); now = system.currenttimemillis() - base; }}}結合方法自体が待機方法を介して待つことを実装していることがわかります。ここでは、スレッドがまだ実行されている場合は、待ち続けていると判断されます。指定された時間が来た場合、またはスレッドが実行された場合、コードは引き続き下向きに実行され、呼び出しスレッドは後続のロジックを実行できます。
しかし、ここでは、notifyまたはnotifyallメソッドをどこに呼び出すかはわかりません。呼び出されない場合、発信者のスレッドは待ち続けます。それを起こす方法はどこにありましたか?検証を通じて、スレッドが終了すると、Java仮想マシンがスレッドのローカル出口メソッドを実行することがわかりました。
// exit関数:void javathread :: exit(bool destroy_vm、exittype exit_type){... //これにより、結合関連の破壊ロジックsurse_join(this); ...} //結合関連の破壊ロジックstatic void surtic sursed*){javathed*(javathobj(javathobj(); ObjectLocker Lock(threadobj、thread);スレッド - > clear_pending_exception(); java_lang_thread :: set_thread_status(threadobj()、java_lang_thread ::終了); java_lang_thread :: set_thread(threadobj()、null); //ここでは、notifyallメソッドを呼び出して、待機中のスレッドlock.notify_all(thread)を起動します。スレッド - > clear_pending_exception(); }これは、スレッドが目覚めたときに理解されます。その効果を確認するために、以下の例を書きましょう。
public class overest {public static void main(string [] args){threadboy boy = new shoodboy(); boy.start(); } static classスレッドボーイはスレッドを拡張します{@override public void run(){system.out.println( "男の子と女の子は買い物に行く準備ができています"); ThreadGirl girl = new StreadGirl(); girl.start(); try {girl.join(); } catch(arturnedexception e){e.printstacktrace(); } system.out.println( "少年と少女が買い物を始めます"); }} static class threadgirlはスレッドを拡張します{@Override public void run(){int time = 5000; System.out.println(「女の子は化粧を始め、少年は待っています...」); {thread.sleep(time); } catch(arturnedexception e){e.printstacktrace(); } system.out.println( "女の子はメイクアップで終了しました!、時間をかけて" + time); }}}}実行結果は次のとおりです。
少年と少女は買い物をしていて、女の子は化粧をし始め、少年は待っています。 。 。
女の子の化粧は終わりました! 、5000
少年と女の子は買い物を始めました
少年と女の子は買い物に行くつもりです。少女は最初にメイクをする必要があります。女の子がメイクを終えた後、彼女は一緒に買い物に行きます。
では、Join(Time)の使用法は何ですか?
public class overest {public static void main(string [] args){threadboy boy = new shoodboy(); boy.start(); } static classスレッドボーイはスレッドを拡張します{@override public void run(){system.out.println( "男の子と女の子は買い物に行く準備ができています"); ThreadGirl girl = new StreadGirl(); girl.start(); int time = 2000; {girl.join(time); } catch(arturnedexception e){e.printstacktrace(); } system.out.println( "少年は" + time + "を待っていました、もう待ちたくありません、買い物に行きません"); }} static class threadgirlはスレッドを拡張します{@Override public void run(){int time = 5000; System.out.println(「少女は化粧を始めた、少年は待っていた...」); {thread.sleep(time); } catch(arturnedexception e){e.printstacktrace(); } system.out.println( "女の子が作り終わった!、時間を取る時間" +時間); }}}ここでは、JoinメソッドはJoin(Time)メソッドにのみ置き換えられます。説明は変更され、印刷の結果は次のとおりです。
少年と少女は買い物をしていて、女の子は化粧をし始め、少年は待っています。 。 。
少年は2,000を待っていて、もう待ちたくありませんでした。彼は買い物に行き、女の子は化粧をし終えました! 、5000
少年は(時間)の時間を待っていました。この時間が到着してから少女がいたスレッドが処刑されなかった場合、彼はもう待つことなく、その後のロジックを実行し続け、女の子を待たずに自分で買い物に行くだけです。
これから、結合方法は、2つのスレッドの同期実行をより便利に達成することであることがわかります。スレッド1が実行されます。スレッド2に遭遇した後、スレッド2が実行されるのを待ってから、スレッド1の実行を実行し続けます。参加の意味は、今ではより視覚的になりました。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。