ツール、CyclicBarrierを、セマフォ、交換のたCountDownLatch同時使用

1.CountDownLatch

 一つ以上の二次同期スレッドが終了し、他のスレッドで実行された操作のセットまで待つことができます。

 A  CountDownLatch与えられたとのカウント初期化。awaitメソッドのブロックに起因するまでcountDown()の方法呼び出し待機中のすべてのスレッドが解放された後、現在のカウントにつながった、ゼロに達し、それ以降のawait 呼び出しはすぐに返されました。これは、1回限りの現象である-カウントはリセットできません。バージョンカウントをリセットする必要がある場合は、使用を検討してくださいCyclicBarrier

パブリック クラスCountDownLatchTest { 

    公共 のボイド会議(たCountDownLatchたCountDownLatch){ 
        System.out.printlnは(にThread.currentThread()のgetName()。 + "...会議を待って、会議室に到達した" );
         試み{ 
            countDownLatch.countDown(); 
        } キャッチ(例外E){ 
            e.printStackTrace(); 
        } 
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){ 

        // 次の実行スレッドがすべての着信の完了後に実行される、またはされているスレッドたCountDownLatch着信番号、待っ 
        たCountDownLatchたCountDownLatch = 新しい新たCountDownLatchを(3。);

        CountDownLatchTest countDownLatchTest = 新しいCountDownLatchTest(); 
        実行可能な実行可能 =() - > countDownLatchTest.meeting(たCountDownLatch)。
        新しいスレッド(実行可能).start();
        新しいスレッド(実行可能).start();
        新しいスレッド(実行可能).start(); 

        試す{ 
            countDownLatch.await()。
        } キャッチ(InterruptedExceptionある電子){ 
            e.printStackTrace(); 
        } 
        のSystem.out.println( "全部线程执行完毕" )。
    } 
}

 

2.CyclicBarrier

 それは、お互いのすべてのセカンダリ共通のバリアポイントを同期するために待機しているスレッドのセットを可能にします。ループブロッキングは、スレッドの固定サイズの正方形を含む手順に有用である、これらのスレッドは時折お互いのを待たなければなりません。バリアと呼ばれるサイクルを、それが解放されたスレッドを待機した後に再使用することができますので、。

CyclicBarrierサポートオプションのRunnableコマンド、各障壁は最後のスレッドがパーティーに到着した後、一度実行されますが、任意のスレッドを解放する前に。続行する任意のパーティの前に、このバリア操作共有状態を更新するために便利です。

パブリック クラスCyclicBarrierTest { 

    公共 のボイド会議(CyclicBarrierをCyclicBarrierを){ 
        System.out.printlnは(にThread.currentThread()のgetName()。 + "...会議を待って、会議室に到達した" );
         試み{ 
            CyclicBarrier.await(); 
            システム.out.println(にThread.currentThread()のgetName() + "スピーチ..." ); 
        } キャッチ(例外E){ 
            e.printStackTrace(); 
        } 
    } 
    
    パブリック 静的 ボイドメイン(文字列[]引数){ 

        // まず、スレッドCyclicBarrierを工法の着信番号、その後の実行時にすべての着信そう待っているの完了後に実行スレッド数
        CyclicBarrierを= CyclicBarrierを新しい新しい CyclicBarrierを(3 ); 

        // CyclicBarrierをコンストラクタ第二に、スレッドの着信番号、完全に入ってくる次の実行が完了した後に実施し、または他のを待っているスレッドの数、実行完了後に渡された最後のスレッドの実行実行可能に書き込みインタフェースからコード 
        CyclicBarrierをcyclicBarrier1 = 新しい新しい CyclicBarrierを(3、() - >のSystem.out.println(にThread.currentThread()のgetName()+ "すべての会議が始まり、到着しました。"。 )); 

        cyclicBarrierTest cyclicBarrierTest = 新しい新しいcyclicBarrierTest (); 
        RunnableをRunnableを =() - > cyclicBarrierTest.meeting(cyclicBarrier1);
         新しい新しいスレッド(Runnableを).start();
         新しい新しいスレッド(Runnableを).start();
         新しい新規スレッド(Runnableを).start();
    } 
}

 

3.Semaphore

 カウンティングセマフォ。概念的には、セマフォは許可のセットを維持します。必要に応じて、それぞれがacquire()され、あなたがそれを使用することができます前に、ライセンスが利用可能になるまでブロックされました。それぞれのrelease()潜在的買収者の解放を阻止する、ライセンスを追加します。しかし、実際の許可オブジェクトは、Semaphoreのみ利用可能回数のカウントを保持しない、それに応じて行われ

 セマフォは、典型的には、スレッドの数ではなく、いくつかの(物理的または論理的な)リソースへのアクセスを制限するために使用されます。

 

パブリック クラスSemaphoreTest { 

    公共 ボイド法(セマフォセマフォ){
         しようと{ 
            (semaphore.acquire)。
            System.out.println(。にThread.currentThread()のgetName() + "実行されました..." ); 

            Thread.sleep( 2000 ); 
            semaphore.release(); 
        } キャッチ(InterruptedExceptionある電子){ 
            e.printStackTrace(); 
        } 
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){ 
        SemaphoreTest semaphoreTest = 新しいSemaphoreTest()。

        セマフォセマフォ = 新しいセマフォ(10 )。

        ながら){
             新しいスレッド(() - > 。semaphoreTest.method(セマフォ)))(開始。
        } 
    } 
}

 

4.Exchanger

スレッド同期ポイントを交換および成人における内部整合要素であることができます。入力内の各スレッドexchangeいくつかのオブジェクトがスレッドと共同研究者と一致し、引き換えにそのパートナーのオブジェクトを受け取り提供方法。取引所は、双方向形式として見ることができますSynchronousQueue交換器と、このような配管が有用である可能性があるように設計遺伝的アルゴリズムなどのアプリケーションインチ

パブリック クラスExchangerTest { 
    
    公共 のボイド A(交換<文字列> 交換器){ 
        System.out.printlnは( "開始する方法..." );
         試み{ 
            System.out.printlnは(「データ収集方法が始まります... " ); 
            のThread.sleep( 4000 ); 
            のSystem.out.println( "データキャプチャ方法Aの終わり" ); 

            文字列RES =" 12345 " ; 
            のSystem.out.println( "比較結果が「待機); 
            exchanger.exchange (RES); 
        } キャッチ(InterruptedExceptionあるE){
            e.printStackTrace(); 
        } 
    } 

    公共 ボイド B(交換の<string> 交換器){ 
        するSystem.out.println( "方法Bを開始..." );
         試み{ 
            するSystem.out.println(「方法Bは、クロールを開始しますデータ... " ); 
            のThread.sleep( 4000 ); 
            のSystem.out.println( "データキャプチャ方法Bの終わり" ); 
            文字列RES =" 12345 " 
            文字列値 = exchanger.exchange(RES)
            のSystem.out .println( "比較結果:" + value.equals(RES))。
        } キャッチ(InterruptedExceptionある電子){ 
            e.printStackTrace(); 
        } 
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){ 

        ExchangerTest exchangerTest = 新しいExchangerTest()。
        交換 <文字列>交換= 新しい交換<> (); 

        新しいスレッド(() - > exchangerTest.a(交換)))(開始。
        新しいスレッド(() - > exchangerTest.b(交換)))(開始。
    } 
}

 

おすすめ

転載: www.cnblogs.com/gyli20170901/p/10931497.html