JAVAマルチスレッド同時(CyclicBarrier、CountDownLatch、Semaphoreの使い方)

3757 ワード

CountDownLatch(スレッドカウンタ)
CountDownLatchクラスはjava.util.concurrentパッケージの下にあり、カウンタのような機能を実現することができます.たとえば、他の4つのタスクの実行が完了してから実行されるタスクAがあります.この場合、CountDownLatchを使用してこの機能を実現することができます.
final CountDownLatch latch = new CountDownLatch(2);
new Thread(){
    public void run() {
        System.out.println("   "+Thread.currentThread().getName()+"    ");
        Thread.sleep(3000);
        System.out.println("   "+Thread.currentThread().getName()+"    ");
        latch.countDown();
    };
}.start();
new Thread(){ 
    public void run() {
        System.out.println("   "+Thread.currentThread().getName()+"    ");
        Thread.sleep(3000);
        System.out.println("   "+Thread.currentThread().getName()+"    ");
        latch.countDown();
    };
}.start();
System.out.println("   2         ...");
latch.await();
System.out.println("2           ");
System.out.println("       ");

CyclicBarrier(ループバックフェンス-barrier状態まで待ってからすべて同時に実行)
文字通りループフェンスは、スレッドのセットをある状態に待ってからすべて同時に実行することができます.ループとは,すべての待機スレッドが解放されると,CyclicBarrierが再利用できるためである.この状態をbarrierと呼び,await()メソッドを呼び出すとスレッドはbarrierになる.
CyclicBarrierで最も重要な方法はawaitメソッドで、2つのリロードバージョンがあります.
1.public int await():すべてのスレッドがbarrier状態に達するまで、現在のスレッドを一時停止し、後続のタスクを同時に実行します.
2.public int await(long timeout,TimeUnit unit):これらのスレッドを一定の時間まで待たせ、barrier状態に達していないスレッドがある場合はbarrierに到着したスレッドに後続のタスクを直接実行させる.
具体的には以下のように使用し,またCyclicBarrierは再利用可能である.
public static void main(String[] args) {
    int N = 4;
    CyclicBarrier barrier = new CyclicBarrier(N);
    for(int i=0;i

Semaphore(信号量-
同時アクセスを制御するスレッド数
)
S
emaphoreは文字通り信号量を意味し、
Semaphoreは同時にアクセスするスレッドの数を制御し、
acquire()でライセンスを取得し、なければ待機し、release()でライセンスを解放します.Semaphoreクラスで重要ないくつかの方法:
1.public void acquire():ライセンスを取得するために使用され、ライセンスが取得できない場合は、ライセンスが取得されるまで待機します.
2.public void acquire(int permits):permits個のライセンスを取得する
3.public void release(){}:ライセンスを解放します.ライセンスを解放する前に、ライセンスを取得する必要があります.
4.public void release(int permits):permits個のライセンスを解放する上の4つの方法はブロックされます.すぐに実行結果を得るには、次の方法を使用します.
1.public boolean tryAcquire():ライセンスを取得しようとし、取得に成功したらtrueを返し、取得に失敗したらfalseを返します.
2.public boolean tryAcquire(long timeout,TimeUnit unit):ライセンスを取得しようとし、指定した時間内に成功した場合はtrueに戻り、そうでない場合はfalseに戻ります.
3.public boolean tryAcquire(int permits):permits個のライセンスを取得しようとし、取得に成功したらtrueを返し、取得に失敗したらfalseを返す
4.public boolean tryAcquire(int permits,long timeout,TimeUnit unit):permits個のライセンスを取得しようとし、指定した時間内に成功したらすぐにtrueに戻り、そうでなければすぐにfalseに戻る
5.availablePermits()メソッドを使用して使用可能なライセンス数を取得することもできます.例:一つの工場に5台の機械があるが、8人の労働者がいて、1台の機械は同時に1人の労働者にしか使用できず、使用が終わってから、他の労働者が使用を続けることができる.では、Semaphoreで実現できます.
{
    int N = 8; //   
    Semaphore semaphore = new Semaphore(5); //    
    for(int i=0;i

CountDownLatchとCyclicBarrierはいずれもスレッド間の待機を実現することができるが、それらの側面の重点は異なる.CountDownLatchは一般的に
スレッドAは、複数の他のスレッドがタスクを実行するのを待っている後
を選択します.そして
CyclicBarrierは、一般に、スレッドのセットが互いにある状態まで待機し、その後、スレッドのセットが同時に実行される.また、CountDownLatchは再利用できませんが、CyclicBarrierは再利用できます.
Semaphoreは、通常、リソースのグループへのアクセス権を制御するために使用されるロックと似ています.