コンセプト
たCountDownLatchクラスは、1つ以上のスレッドがその実行後に、別のスレッドの実行まで待機することができます同期ツールです。例えば、フレームワークの実装がサービスを開始する責任があることをご希望のスレッドの後に、アプリケーションのメインスレッドは、すべてのサービスの枠組みの中で開始されています。
たCountDownLatchの使用状況
CountDownlacth典型的な使い方1:
待機n個のスレッドに対する一つのスレッドが実行を開始する前に終了します。カウンタがN(新規たCountDownLatch(N))に初期化されたCountDownLatch 、 タスクのスレッドが終了するたびに、カウンタは、あろうマイナス1(countdownlatch.countDown())、カウンタ値がたCountDownLatchが0になると、 await()
スレッドそれが目覚めされます。サービスの開始は、メインスレッドが実行を継続する前にロードされたコンポーネントの数を待つ必要がある場合の典型的なシナリオがあります。
たCountDownLatch典型的な使用方法2:
複数のスレッドを達成するための最大並列タスクを実行するために開始します。なお、並列処理は、同時ではない、複数のスレッドが同時に時に開始することを強調しました。複数のスレッドにレース、開始点と同様に、開始銃を待って、その後、同時に実行を開始しました。実際、共有たCountDownLatch(1)を初期化することで、そのカウンタを1に初期化され、メインスレッドがカウントダウン(呼び出しタスクを開始する前に、最初coundownlatch.await複数のスレッド())、カウンタが到達が同時に複数のスレッドをゼロ目を覚まして。
たCountDownLatch原理
カウンタの数、糸カウンタの初期値によって達成。たびにその任務が完了した後、スレッドは、対応するカウンタの値を1だけデクリメントされます。カウンタが0に達すると、すべてのスレッドがタスクを完了したことを示し、その後任務に復元することができるスレッドのロックを待ちます。
使用例:
1 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ 2 たCountDownLatchラッチ= 新しいたCountDownLatch(10 )。 3 4 のための(INT iは= 0; iは<9; I ++ ){ 5 新しいスレッド(新しいRunnableを(){ 6 @Override 7 公共 ボイドラン(){ 8 。のSystem.out.println(にThread.currentThread()のgetName( )+ "运行" ); 9 試み{ 10 Thread.sleep(3000 ); 11 } キャッチ(InterruptedExceptionあるE){ 12であり ; e.printStackTrace() 13である } 最後に{ 14 latch.countDown(); 15 } 16 } 17 })を起動(); 18れる } 。19 20 システム.out.println( "子スレッド実行終了を待つ" ); 21 latch.await(10 、TimeUnit.SECONDS); 22 のSystem.out.println( "端子スレッドが実行しています"。); 23 }
2つのスレッドは、子スレッドの後に処理、加工し処理を開始し、メインスレッドを待って、メインスレッド出力
クラス MyRunnable 実装Runnableを{ プライベートたCountDownLatchたCountDownLatch。 プライベートたCountDownLatchののawait。 公共MyRunnable(たCountDownLatchたCountDownLatch、たCountDownLatchのawait){ この .countDownLatch = たCountDownLatch。 この .await =が待っています。 } @Override 公共 無効実行(){ 試み{ countDownLatch.await(); System.out.println( "子线程" +にThread.currentThread()のgetName()+ "处理自己事情"。 )。 Thread.sleep( 1000年); await.countDown(); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } }
パブリック 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ たCountDownLatchたCountDownLatch = 新しいたCountDownLatch(1 )。 たCountDownLatchのawait = 新しいたCountDownLatch(5 )。 以下のために(INT I = 0; I <5; I ++ ){ 新しいスレッド(新しいMyRunnable(たCountDownLatch、のawait))開始します()。 } のSystem.out.println( "主线程处理自己事情" )。 Thread.sleep( 3000 ); countDownLatch.countDown(); System.out.printlnは( "メインスレッドが終了" ); await.await(); System.out.printlnは( "問題処理された子スレッド" ); }
リアルタイムシステムにおける利用シナリオ
最大並列用:時々 、私たちは、並列処理の最大の度合いを達成するために、複数のスレッドを開始したいです。例えば、我々は、シングルトンクラスをテストしたいです。私たちはたCountDownLatch 1初期カウンタを作成し、他のすべてのスレッドがロックを待機している場合は、他のすべての待機中のスレッドが実行を再開するために、単にコール一度カウントダウン()メソッドを使用することができます。
作業を始める前に、自分のタスクを完了するのを待っているN個のスレッド:たとえば、アプリケーションはユーザーの要求を処理する前に、クラスを開始することを確実にするために、すべてのNの外部システムはすでに稼働しています。
デッドロックの検出:非常に便利な使用シナリオでは、リソース、各試験段階にあるスレッドの異なる数を共有し、そしてデッドロックしようとアクセスにN個のスレッドを使用することです。
----------------
免責事項:この記事はCSDNブロガーであるオリジナルの記事、CC 4.0 BY-SAの著作権契約書に従って、再現し、元のソースのリンクを添付してください「小さいあなたより春風Shili。」そしてこの文。
オリジナルリンクします。https://blog.csdn.net/qq812908087/article/details/81112188