アクションに参加
役割は、待機中のスレッドオブジェクトが破壊される参加します。
作用の方法は、スレッドオブジェクトXに参加することである属するタスクの通常の実行run()メソッドは、現在のスレッドが無期限にZをブロックし、その後、待機中のスレッドのZ X破壊後に、現在のスレッドの背後にあるコードを継続しています。
注意:
この方法は、参加する場合は()と割り込み()メソッドは、例外がスローされ遭遇。例としては、次のとおりです:
パブリック クラスJoinException { 公共 静的 ボイドメイン(文字列[]引数){ 試み{ ThreadB B = 新しいThreadB()。 b.start(); Thread.sleep( 500 )。 ThreadC C = 新しいThreadC(B)。 c.start(); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } 静的 クラススレッドAが延びスレッド{ @Override 公開 無効実行(){ のためには、(int型は、私は= 0;私<Integer.MAX_VALUEでは、I ++ ){ 文字列NEWSTRING = 新しい文字列(); Math.random(); } } } 静的 クラス ThreadBは延びスレッド{ @Override 公共 ボイドラン(){ 試み{ スレッド = 新しいスレッドAを(); a.start(); a.join(); System.out.printlnは("Bがで実行最終的に印刷されたスレッド" ); } キャッチ(InterruptedExceptionあるE)は{ のSystem.out.printlnは( "のキャッチスレッドBに印刷" ); e.printStackTrace(); } } } 静的 クラス ThreadCが延びているスレッド{ プライベートとThreadB ThreadBその; 公共ThreadC(及びThreadB ThreadBこと){ この .threadB = ThreadB; } @Override 公共 ボイドRUN(){ threadB.interrupt(); } } }
結果は以下の通りであります:
ロックを解除する)(参加
Thread.sleep()はロックを解除しません。join()メソッドは、ロックを解除します
この方法は、(長い)機能に参加し、内部ので、(長い)メソッドがロックを解除する機能参加、達成するために、(long)メソッドを待って使用されています。
この方法は、(長い)ソースコードに参加以下の通りであります:
事前の背後で実行する方法参加()コード:予期しません
事故への参加()の時間パラメータが発生しやすい設定します(長いミリ秒)に参加。例としては、次のとおりです:
ヒント:最終的な解決策はb.joinにある(2000年)に置き換えb.join()
パブリック クラスJoinTest { 公共 静的 ボイドメイン(文字列[]引数){ 試み{ ThreadB B = 新しいThreadB()。 スレッドA A = 新しいスレッドA(B)。 a.start(); b.start(); b.join( 2000 ); System.out.println( "主EDN" + のSystem.currentTimeMillis())。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } 静的 クラススレッドAが延びスレッド{ プライベートThreadB bを、 パブリックスレッドA(ThreadB b)は{ この .B = B。 } @Override 公共 ボイドラン(){ 同期(B){ 試み{ するSystem.out.println( "始まるAのthreadName =" +にThread.currentThread()のgetName()+ "" + のSystem.currentTimeMillis())。 Thread.sleep( 5000 ); System.out.println( "AのthreadNameを終了=" +にThread.currentThread()のgetName()+ "" +System.currentTimeMillis())。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } } 静的 クラス ThreadBが延びスレッド{ @Overrideが 同期 公共 ボイドランを(){ 試み{ するSystem.out.println( "BのthreadNameを開始=" +にThread.currentThread()のgetName()+ "" + のSystem.currentTimeMillis ())。 Thread.sleep( 5000 ); System.out.printlnは(。+にThread.currentThread()のgetName()+ "" + "BのthreadName =終了" のSystem.currentTimeMillisを())。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } }
業績の分析: