Java並行プログラミングの要約12:並行性ツール:Semaphore、Exchanger、CountDownLatch、CyclicBarrier

以前に書かれたブログを参照してください:
詳細なJava同時実行ツール:Semaphore、Exchanger

そして:一般的なJava同時実行ツール-CountDownLatch、CyclicBarrier

 

 

一般的な要約:

1.セマフォ、リソースに同時にアクセスできるスレッドの数を制御して、複数のスレッドが特定のリソースを合理的に使用できるようにするために使用されるセマフォとして理解できます

セマフォはライセンスと同等です。スレッドは、スレッドの実行を続行する前に、acquireメソッドを介してライセンスを取得する必要があります。そうしないと、このメソッドでブロックして待機することしかできません。ビジネス関数を実行するときはrelease()、他のスレッドがライセンスを取得して実行を継続できるようにメソッドでライセンス返す必要があります。

セマフォは、リソースの使用が制限されているアプリケーションシナリオに特に適しています。

取得、試行取得、リリース;

 

2. Exchangerは、スレッド間のコラボレーションに使用されるツールクラスであり、2つのスレッド間の交換に使用されます。これは、2つのスレッドがデータを交換できる交換用の同期ポイントを提供します。

特定のデータ交換は、交換メソッドを介して行われます。一方のスレッドが最初に交換メソッドを実行すると、もう一方のスレッドが同時に交換メソッドを実行するのを待ちます。この時点で、両方のスレッドが同期ポイントに到達し、2つのスレッドが同期ポイントに到達します。スレッドはデータを交換できます。

3、CountDownLatch

複数のスレッドが連携してビジネス機能を完了する場合、メインスレッドがビジネス機能を実行し続ける前に、複数のスレッドがタスクを完了するのを待つ必要がある場合があります。このビジネスシナリオでは、通常、Threadクラスのjoinメソッドを使用してメインスレッドは結合されたスレッドの実行を待機した後、メインスレッドは実行を継続できます。もちろん、スレッド間のメッセージ通信メカニズムを使用して実行することもできます。実際、Java同時実行ツールクラスは、前述のビジネスシナリオを簡単に完了することができる「カウントダウン」のようなツールクラスを提供します。

使用例:

public class CountDownLatchDemo {
private static CountDownLatch startSignal = new CountDownLatch(1);
//用来表示裁判员需要维护的是6个运动员
private static CountDownLatch endSignal = new CountDownLatch(6);

public static void main(String[] args) throws InterruptedException {
    ExecutorService executorService = Executors.newFixedThreadPool(6);
    for (int i = 0; i < 6; i++) {
        executorService.execute(() -> {
            try {
                System.out.println(Thread.currentThread().getName() + " 运动员等待裁判员响哨!!!");
                startSignal.await();
                System.out.println(Thread.currentThread().getName() + "正在全力冲刺");
                endSignal.countDown();
                System.out.println(Thread.currentThread().getName() + "  到达终点");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }
    System.out.println("裁判员发号施令啦!!!");
    startSignal.countDown();
    endSignal.await();
    System.out.println("所有运动员到达终点,比赛结束!");
    executorService.shutdown();
}
}
输出结果:

pool-1-thread-2 运动员等待裁判员响哨!!!
pool-1-thread-3 运动员等待裁判员响哨!!!
pool-1-thread-1 运动员等待裁判员响哨!!!
pool-1-thread-4 运动员等待裁判员响哨!!!
pool-1-thread-5 运动员等待裁判员响哨!!!
pool-1-thread-6 运动员等待裁判员响哨!!!
裁判员发号施令啦!!!
pool-1-thread-2正在全力冲刺
pool-1-thread-2  到达终点
pool-1-thread-3正在全力冲刺
pool-1-thread-3  到达终点
pool-1-thread-1正在全力冲刺
pool-1-thread-1  到达终点
pool-1-thread-4正在全力冲刺
pool-1-thread-4  到达终点
pool-1-thread-5正在全力冲刺
pool-1-thread-5  到达终点
pool-1-thread-6正在全力冲刺
pool-1-thread-6  到达终点
所有运动员到达终点,比赛结束!

4.サイクリックバリア:CyclicBarrier

CyclicBarrierは、マルチスレッド同時実行制御の実用的なツールでもあります。CountDownLatchと同じ待機カウント関数がありますが、CountDownLatchよりも強力です

CyclicBarrierを理解するために、ここに一般的な例を示します。スポーツミーティングが開催されると、スポーツとしてのランニングが行われます。競技場に入るときの状況をシミュレートしましょう。6つのトラックがあると仮定すると、競技の開始時に6人のアスリートがスタート地点に立つ必要があります。競技の始まりレフリーは笛を吹いてから走り始めることができます。滑走路の始点は臨界点である「バリア」に相当し、これらの6人のアスリートは糸に類似しています。つまり、これらの6本の糸は指定された点に到達する必要があります。つまり、波を前に集めることができます。実行を続行できます。それ以外の場合、各スレッドはブロックして、ウェーブが収集されるまで待機する必要があります。Cyclicは循環を意味します。つまり、CyclicBarrierは、複数のスレッドがウェーブを構成した後も有効であり、次のウェーブを構成し続けることができます。CyclicBarrierの実行図は次のとおりです。

複数のスレッドが指定されたポイントに達した場合、それらは実行を継続できます。これは、数字を報告する感覚に少し似ています。6つのスレッドが6人のアスリートに相当すると仮定すると、トラックの開始時に統計のために数字が報告されます。6の場合、この波が収集され、実行されました。

CyclicBarrierを1回使用した後も、以下は引き続き有効であり、引き続きカウンターとして使用できます。これは、CountDownLatchとの違いの1つです。

ここでの6つのスレッド、つまりカウンターの初期値6は、CyclicBarrier構築メソッドを介して渡されます。

主な方法:

//等到所有的线程都到达指定的临界点
await() throws InterruptedException, BrokenBarrierException 

//与上面的await方法功能基本一致,只不过这里有超时限制,阻塞等待直至到达超时时间为止
await(long timeout, TimeUnit unit) throws InterruptedException, 
BrokenBarrierException, TimeoutException 

//获取当前有多少个线程阻塞等待在临界点上
int getNumberWaiting()

//用于查询阻塞等待的线程是否被中断
boolean isBroken()

    
//将屏障重置为初始状态。如果当前有线程正在临界点等待的话,将抛出BrokenBarrierException。
void reset()

CountDownLatchとCyclicBarrierの比較:

CountDownLatchとCyclicBarrierはどちらも同時実行性制御するために使用されるツールクラスです。どちらもカウンターを維持するものとして理解できますが、2つはまだ異なる焦点を持っています。

  1. CountDownLatchは通常、スレッドAが他のいくつかのスレッドがタスクを実行するのを待ってから実行するために使用されます。CyclicBarrierは通常、スレッドのグループが互いに特定の状態になるまで待機するために使用され、このスレッドのグループは同時に; CountDownLatchはスレッドを強調します複数のスレッドが何かを完了するのを待ちます。CyclicBarrierは、複数のスレッドが互いに待機し、全員が完了するのを待ってから、連携することです。
  2. CountDownLatchのcountDownメソッドを呼び出した後、現在のスレッドはブロックされず、実行を継続します。CyclicBarrierのawaitメソッドを呼び出すと、CyclicBarrierで指定されたすべてのスレッドが指定されたポイントに到達するまで、現在のスレッドがブロックされます。
  3. CountDownLatchメソッドは比較的小さく、操作は比較的単純です。CyclicBarrierは、getNumberWaiting()、isBroken()などのより多くのメソッドを提供して、複数のスレッドの現在のステータスを取得します。CyclicBarrierの構築メソッドはbarrierActionで渡すことができます。、すべてのスレッドが到着したときにすべてのビジネス関数がいつ実行されるかを指定します。
  4. CountDownLatchは再利用できませんが、CyclicLatchは再利用できます

 

 

おすすめ

転載: blog.csdn.net/ScorpC/article/details/113929960