ホームページ  >  記事  >  Java  >  Java で CyclicBarrier を使用して高い同時実行性を実現する方法

Java で CyclicBarrier を使用して高い同時実行性を実現する方法

PHPz
PHPz転載
2023-04-14 19:07:081098ブラウズ

Java の CyclicBarrier は、すべてのスレッドがバリアに到達するまで実行を続行できるようになるまで、複数のスレッドがバリアで待機できるようにする同期ツールです。 CyclicBarrier を使用すると、複数のスレッドの実行を調整し、特定の時点で同時に実行できるようになります。

CyclicBarrier は Java の同期ツールで、すべてのスレッドが実行を続行する前に、すべてのスレッドがバリア ポイントに到達するまで、複数のスレッドがバリア ポイントで待機できるようにします。 CyclicBarrier を使用すると、複数のスレッドの実行を調整し、特定の時点で同時に実行できるようになります。

使用法

CyclicBarrier の基本的な使用法は次のとおりです:

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

public class CyclicBarrierExample {

    public static void main(String[] args) {
        int n = 3;
        CyclicBarrier barrier = new CyclicBarrier(n, new Runnable() {
            public void run() {
                System.out.println("All threads have reached the barrier");
            }
        });

        Thread t1 = new Thread(new MyRunnable(barrier), "Thread 1");
        Thread t2 = new Thread(new MyRunnable(barrier), "Thread 2");
        Thread t3 = new Thread(new MyRunnable(barrier), "Thread 3");

        t1.start();
        t2.start();
        t3.start();
    }

    static class MyRunnable implements Runnable {
        private final CyclicBarrier barrier;

        public MyRunnable(CyclicBarrier barrier) {
            this.barrier = barrier;
        }

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

この例では、3 つのスレッドがバリアに到達するまで待機する必要がある CyclicBarrier オブジェクトを作成します。ポイント。すべてのスレッドがバリア ポイントに到達すると、コールバック関数がトリガーされ、メッセージが出力されます。

3 つのスレッドを作成し、カスタム Runnable オブジェクトに渡します。各スレッドの run メソッドでは、まずスレッドがバリア ポイントを待っていることを示すメッセージを出力します。次に、barrier.await() メソッドを呼び出してスレッドを待機キューに追加します。すべてのスレッドがバリア ポイントに到達するまで実行は続行されません。最後に、スレッドがバリア ポイントを越えたことを示すメッセージを出力します。

上記のコードの実行結果は次のとおりです。

スレッド 1 はバリアで待機しています...
スレッド 3 はバリアで待機しています...
スレッド 2 がバリアで待機しています...
すべてのスレッドがバリアに到達しました
スレッド 2 がバリアを通過しました
スレッド 1 がバリアを通過しました
スレッド 3 がバリアを通過しました

上記のコードから、CyclicBarrier がオプションのコールバック関数もサポートしていることもわかります。すべてのスレッドがバリア ポイントに到達すると、指定されたコールバック関数が呼び出されます。上の例では、すべてのスレッドがバリア ポイントに到達すると、指定されたコールバック関数が呼び出されます。バリア ポイント 時間になると、コールバック関数が実行され、バリア ポイントに到達したことが示されます。

CyclicBarrier は、スレッドがバリア ポイントに到達するのを待機している間に追加の操作を実行する、より高度な使用法もサポートしています。これは、以下に示すように、await メソッドの戻り値によって実現できます:

int index = barrier.await();
if (index == 0) {
    // 执行额外的操作
}

この例では、await メソッドの戻り値は、待機キュー内のスレッドの位置を示します。が 0 の場合、現在のスレッドがバリア ポイントに到達する最後のスレッドであり、データ クリーニングなどの仕上げ作業など、追加の操作を実行できることを意味します。

注意事項

Java で CyclicBarrier を使用する場合は、次の点に注意する必要があります:

1. CyclicBarrier のカウンターは再利用可能です。すべてのスレッドがバリア ポイントに到達すると、カウンタは初期値にリセットされ、再び使用できるようになります。 待機プロセス中に例外が発生した場合、カウンターはリセットされ、待機中のすべてのスレッドは BrokenBarrierException 例外をスローします。

2. CyclicBarrier 使用時に待機スレッド数がカウンタの初期値を超えると、すべてのスレッドが永久に待機することになります。 したがって、CyclicBarrier を使用する場合は、待機スレッドの数がカウンターの初期値を超えないようにする必要があります。

3. CyclicBarrier のコールバック関数は、最後のスレッドがバリア ポイントに到達したときに実行されます。したがって、コールバック関数で実行される操作はスレッドセーフである必要があります。予期せぬ結果を招く可能性があります。

4.CyclicBarrier を使用すると、複数のスレッドの実行を調整し、特定の時点で同時に実行できるようになります。 **ただし、プログラムの正確性にとってスレッド間の実行順序が重要な場合は、CyclicBarrier が最良の選択ではない可能性があります。 **この場合、CountDownLatch や Semaphore などの他の同期ツールの使用が必要になる場合があります。

5. CyclicBarrier のパフォーマンスは、待機スレッドの数とカウンターの初期値に影響される可能性があります。 **待機スレッド数が多い場合、またはカウンタの初期値が大きい場合、パフォーマンスが低下する可能性があります。 **したがって、CyclicBarrierを使用する場合は、実際の状況に応じて調整する必要があります。

つまり、Java で CyclicBarrier を使用する場合、プログラムの正確さとパフォーマンスを確保するには、さまざまな状況を慎重に考慮する必要があります。

以上がJava で CyclicBarrier を使用して高い同時実行性を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。