サイクリックバリアとは何ですか?重要な事実と例の説明

Barbara Streisand
リリース: 2024-10-09 06:08:29
オリジナル
605 人が閲覧しました

What Is CyclicBarrier? Key Facts and Examples Explained

1. CyclicBarrier とは何ですか?

CyclicBarrier は、一連のスレッドが互いに共通のバリア ポイントに到達するのを待機できるようにする同期支援機能です。すべてのスレッドがバリアに到達すると、解放されて作業を続行します。バリアは、待機中のスレッドが解放された後に再利用できるため、「循環」と呼ばれます。

1.1 CyclicBarrier の主な機能

  • 再利用性 : CountDownLatch などの他の同期補助とは異なり、 CyclicBarrier は、すべてのスレッドが解放された後にリセットして再度使用できます。
  • バリア アクション : オプションで、すべてのスレッドがバリアに到達したときに実行されるバリア アクションを指定できます。
  • 柔軟性 : 複数のスレッドが次のフェーズに進む前に、お互いにフェーズが完了するのを待つ必要があるシナリオで役立ちます。

1.2 CyclicBarrier の仕組み

  • 初期化 : CyclicBarrier は、バリアで待機する必要がある多数のパーティ (スレッド) で初期化されます。
  • Waiting : 各スレッドはバリア上で await() メソッドを呼び出します。
  • Release : 最後のスレッドがバリアに到達すると、待機中のすべてのスレッドが解放され、オプションのバリア アクション (指定されている場合) が実行されます。
  • 再利用 : バリアはリセットされ、別の待機サイクルで再度使用できます。

1.3 一般的な使用例

  • バッチ処理 : データをバッチで処理する場合、スレッドは CyclicBarrier を使用して各バッチの最後に同期できます。
  • 並列アルゴリズム : 並列アルゴリズムでは、多くの場合、計算の特定のフェーズを完了した後にスレッドを同期する必要があります。

2. 実践例とデモ

CyclicBarrier がどのように機能するかをより深く理解するために、実際の例とデモを見てみましょう。

2.1 コード例

これは、CyclicBarrier の使用を示す簡単な例です。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo {
    public static void main(String[] args) {
        final int numberOfThreads = 3;
        CyclicBarrier barrier = new CyclicBarrier(numberOfThreads, new BarrierAction());

        for (int i = 0; i < numberOfThreads; i++) {
            new Thread(new Task(barrier)).start();
        }
    }
}

class Task implements Runnable {
    private final CyclicBarrier barrier;

    Task(CyclicBarrier barrier) {
        this.barrier = barrier;
    }

    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + " is waiting at the barrier.");
            barrier.await();
            System.out.println(Thread.currentThread().getName() + " has passed the barrier.");
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

class BarrierAction implements Runnable {
    @Override
    public void run() {
        System.out.println("Barrier Action executed. All threads are released.");
    }
}
ログイン後にコピー

2.2 デモの結果

上記のコードを実行すると、次のシーケンスが表示されます:

  • 各スレッドは、バリアで待機していることを示すメッセージを出力します。
  • すべてのスレッドがバリアに到達すると、BarrierAction が実行され、「バリア アクションが実行されました。すべてのスレッドが解放されました。」と表示されます。
  • 各スレッドは、バリアを通過したことを示すメッセージを出力します。

出力例を次に示します:

Thread-0 is waiting at the barrier.
Thread-1 is waiting at the barrier.
Thread-2 is waiting at the barrier.
Barrier Action executed. All threads are released.
Thread-0 has passed the barrier.
Thread-1 has passed the barrier.
Thread-2 has passed the barrier.
ログイン後にコピー

3. 結論

CyclicBarrier は、Java の複数のスレッドを調整するための貴重なツールです。これにより、スレッドが相互に待機し、複数のサイクルにわたって再利用できるため、多くの同期シナリオに最適です。データをバッチで処理する場合でも、並列アルゴリズムを実装する場合でも、CyclicBarrier の効果的な使用方法を理解すると、マルチスレッド プログラミング スキルが向上します。

ご質問がある場合、またはプロジェクトでの CyclicBarrier の使用についてさらに説明が必要な場合は、お気軽に以下にコメントしてください!

で投稿の詳細を読む: CyclicBarrier とは何ですか?重要な事実と例の説明

以上がサイクリックバリアとは何ですか?重要な事実と例の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート