並行ツールCountDownLatch、CyclicBarrier(同期バリア)、セマフォ(並行スレッドの数を制御)、Exchanger(スレッド交換データ)

CountDownLatch

導入原則

  CountDownLatchは、キューシンクロナイザによって実装されます。

  新しいCountDownLatchオブジェクトを作成するときは、0より大きい整数のintパラメーターを渡す必要があります。このパラメーターは、キューシンクロナイザーの状態同期状態として使用されます。

    public CountDownLatch(int count){
         if(count < 0throw  new IllegalArgumentException(" count <0 " );
        this .sync = new Sync(count); 
    }
        Sync(int count){ 
            setState(count); 
        }

  たCountDownLatchの実装でスレッド場合  のawait()  メソッドの後にはブロックするスピン状態は0であるか否かを決定します。状態は、CountDownLatchの.countDown()  メソッドによって削減され  ます。

    public  void countDown(){ 
        sync.releaseShared(1 ); 
    }

使用シナリオ

  たとえば、複数のシートを計算するために複数のスレッドが必要で、最後に結果を要約する必要がある場合、メインスレッドでawait()を実行し、各シートの計算後にcountDown()を実行できます。

サイクリックバリア

導入原則

  CyclicBarrier同期バリアには2つの作成方法があります。

  最初の種類では、パラメーターは整数のみを渡します。

    public CyclicBarrier(int party){
         this(parties、null ); 
    }

  2番目の種類、パラメーターも達成するためにスレッドを渡す必要があります

    public CyclicBarrier(int party、Runnableバリアアクション){
         if(パーティ<= 0 新しいIllegalArgumentException();をスローするthis .parties = party;
        this .count = partys ;
        this .barrierCommand = バリアアクション; 
    }

  それを呼び出してCyclicBarrierを  のawait()  、現在のスレッドのロック方法、その内部のメンバ変数リエントラントロック。

  最初の:

  1.パラメータが2に渡されたとすると、スレッドはawait()メソッドを実行し、スレッド1は最初にロックを取得してからパーティパラメータを1だけ減らし、それが0かどうかを判断します。0の場合、スレッドの背後にあるロジックが実行されます。

  2. 0でない場合は、Conditionのtrip()メソッドを呼び出し、trip()メソッドはロックを解放して待機します。このとき、スレッド2はロックを取得してから、手順1のロジックを実行できます。このとき、パーティのマイナス1は0です。このとき、ConditionのsignalAll()メソッドが呼び出され、trip()メソッドが実行を継続することをスレッド通知します。

  第二種:

  パラメータは2を渡すだけでなく、別のスレッドでも渡されます(エイリアスはCをフェッチしました)。実際、一般的なロジックは最初のロジックと似ていますが、手順1でパーティが0であると判断された後、最初にスレッドCのロジックを実行し、次に他の2つのスレッドを起動します。

使用シナリオ

セマフォ

導入原則

  セマフォを構築するときは、シェーピングパラメータが必要です。これは、並列で実行できるスレッドの数を示します。

    public Semaphore(int permit ){ 
        sync = new NonfairSync(permits); 
    }

  スレッドでsemaphore.acquire()を実行し てライセンス取得する必要があります。  同期ステータスは変更に応答し、次にsync.releaseShared(1)を実行し   てライセンス解放します。他のスレッドがライセンスを取得できます。

使用シナリオ

  スレッドの数を制限する必要があるさまざまなシナリオ。たとえば、接続プールのシナリオでは、スレッドの数を制限する必要があります。

交換器

使用シナリオ

  スレッド間のデータ交換

おすすめ

転載: www.cnblogs.com/lcmlyj/p/12751008.html