CountDownLatch
導入原則
CountDownLatchは、キューシンクロナイザによって実装されます。
新しいCountDownLatchオブジェクトを作成するときは、0より大きい整数のintパラメーターを渡す必要があります。このパラメーターは、キューシンクロナイザーの状態同期状態として使用されます。
public CountDownLatch(int count){ if(count < 0)throw 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)を実行し てライセンスを解放します。他のスレッドがライセンスを取得できます。
使用シナリオ
スレッドの数を制限する必要があるさまざまなシナリオ。たとえば、接続プールのシナリオでは、スレッドの数を制限する必要があります。
交換器
使用シナリオ
スレッド間のデータ交換