JavaのCountDownLatch使用

8801 ワード

CountDownLatch
1、類紹介
他のスレッドで実行されている一連の操作を完了する前に、1つ以上のスレッドを待機させる同期支援クラス.与えられたカウントでCountDownLatchを初期化します.countDown()メソッドが呼び出されるため、現在のカウントがゼロに達するまでawaitメソッドはブロックされます.その後、待機しているすべてのスレッドが解放され、awaitの後続呼び出しはすぐに返されます.この現象は1回しか現れません.カウントはリセットできません. 1つのスレッド(または複数)は、別のNスレッドが何かを完了してから実行されます.
2、シーンを使う
いくつかの応用場面では、ある条件が要求に達してから後のことをする必要があります.また、スレッドが完了するとイベントがトリガーされ、後続の操作が行われます.この時はCountDownLatchが使えます.CountDownLatchの最も重要な方法はcountDown()とawait()であり、前者は主に逆数であり、後者は逆数を0まで待つことであり、0に達しなければブロック待つしかない.
3、方法説明
countDown
public void countDown()

ラッチのカウントを減算し、カウントがゼロに達した場合、待機しているすべてのスレッドを解放します.現在のカウントがゼロより大きい場合は、カウントが減少します.新しいカウントがゼロの場合、スレッドスケジューリングの目的ですべての待機スレッドが再有効になります.
現在のカウントがゼロに等しい場合、アクションは発生しません.
await
public boolean await(long timeout,
                     TimeUnit unit)
              throws InterruptedException

スレッドが中断されたり、指定された待機時間を超えたりしない限り、現在のスレッドをラッチがゼロにカウントされるまで待機させます.現在のカウントがゼロの場合、このメソッドはすぐに戻ります.  true  値を入力します.
現在のカウントがゼロより大きい場合、スレッドスケジューリングの目的で現在のスレッドは無効になり、次の3つのいずれかが発生するまでスレッドはスリープ状態になります.
  • は呼び出しにより  countDown()  メソッド、カウントがゼロに達します.または
  • 他のスレッドが現在のスレッドを中断します.または
  • は、指定された待ち時間を超えています.

  • カウントがゼロに達すると、メソッドは戻ります.  true  値を入力します.
    現在のスレッドの場合:
  • は、この方法に入ると、スレッドの割り込み状態が設定されている.または
  • は待機中に中断され、
  • .
    投げ出す  InterruptedException、現在のスレッドの割り込み状態をクリアします.指定した待機時間を超えた場合、戻り値は  false .時間がゼロ以下の場合、このメソッドは待機しません.
     
    パラメータ:timeout  - 最長待ち時間unit  -  timeout  パラメータの時間単位.
    戻り値:
    カウントがゼロに達すると、  true ;カウントがゼロに達する前に待機時間を超えた場合は、  false
    放出:InterruptedException  - 現在のスレッドが待機中に中断された場合
    4、関連例
    public class CountDownLatchTest {
    
        //    100   ,10         ,        。          ,    。
        public static void main(String[] args) throws InterruptedException {
    
            //        
            final CountDownLatch begin = new CountDownLatch(1);  
    
            //        
            final CountDownLatch end = new CountDownLatch(10);  
    
            //      
            final ExecutorService exec = Executors.newFixedThreadPool(10);  
    
            for (int index = 0; index < 10; index++) {
                final int NO = index + 1;  
                Runnable run = new Runnable() {
                    public void run() {  
                        try {  
                            //         ,        。
                            //   
                            begin.await();  
                            Thread.sleep((long) (Math.random() * 10000));  
                            System.out.println("No." + NO + " arrived");  
                        } catch (InterruptedException e) {  
                        } finally {  
                            //          ,end   
                            end.countDown();
                        }  
                    }  
                };  
                exec.submit(run);
            }  
            System.out.println("Game Start");  
            // begin  ,    
            begin.countDown();  
            //   end  0,         
            end.await();  
            System.out.println("Game Over");  
            exec.shutdown();  
        }
    }

    5、出力結果
    Game Start No.9 arrived No.6 arrived No.8 arrived No.7 arrived No.10 arrived No.1 arrived No.5 arrived No.4 arrived No.2 arrived No.3 arrived Game Over
    転載先:http://www.itzhai.com/the-introduction-and-use-of-a-countdownlatch.html