JavaにおけるCyclicBarrierの使い方について

4452 ワード

1.説明
CyclicBarrierは、共通のバリアポイント(common barrier point)に達するまでスレッドのセットを互いに待つことができる同期支援クラスです.一定サイズのスレッドのセットに関連するプログラムでは、これらのスレッドは常に互いに待たなければならない.この場合、CyclicBarrierは有用である.このbarrierは、待機スレッドを解放した後に再利用できるため、ループのbarrierと呼ばれる.
2.シーンの使用
CyclicBarrier、中国語では柵を意味します.名前の通り、すべてのスレッドの実行に共通のバルブ値ノードを提供します.プログラムでは、これらのスレッドは、すべてのスレッドがこの共通バルブ値ノードに到達するまで互いに待機し、これらのスレッドは次の動作を実行します.
3.主な方法
Public int await()throws InterruptedException,BrokenBarrierExceptionはすべての参加者がこのbarrierで呼び出されています awaitメソッドの前に、ずっと待っています.現在のスレッドが最後のスレッドに到達しない場合、スケジューリングの目的で無効になり、次のいずれかが発生するまでスレッドはスリープ状態になります.最後のスレッドが到達します.または他のスレッドが現在のスレッドを中断します.または他のスレッドが別の待機スレッドを中断します.または他のスレッドがbarrierを待っている間にタイムアウトします.または他のスレッドがこのbarrierで呼び出されます reset(). 現在のスレッドの場合:このメソッドに入ったときにスレッドの割り込みステータスが設定されています.あるいは待機中に中断される
投げ出す InterruptedExceptionは、現在のスレッドの割り込み状態をクリアします.スレッドが待機状態にある場合barrierは reset()または呼び出し await  時barrier 破損しているか、いずれかのスレッドが待機している場合は、放出されます. BrokenBarrierException  異常.スレッドが待機中に 中断すると、他のすべての待機スレッドが放出されます. BrokenBarrierException  異常で、barrierを破損状態にします.現在のスレッドが最後に到達するスレッドであり、構築方法に空でないバリア操作が提供されている場合、他のスレッドが実行を継続できるようにする前に、現在のスレッドが実行されます.バリア操作中に異常が発生した場合、その異常は現在のスレッドに伝播し、barrierを破損状態にします. 
≪戻る|Return|ldap≫:現在のスレッドに到達した索引.索引 getParties()  - 1  到着する最初のスレッドを示し、ゼロは最後の到着するスレッドを示す:InterruptedException - 現在のスレッドが待機中に中断された場合 - もう一つ スレッドは、現在のスレッドが待機している間に中断またはタイムアウトされたり、barrierがリセットされたり、呼び出されたりします. await  バーrierが破損した場合、または異常によりバリア操作が失敗した場合.
4.例
場面:家の中の料理はもうテーブルに上がったが、家族全員がそろってから食事を始めなければならない.
public class CyclicBarrierTest {

    public static void main(String[] args) {
        int mPeoples = 4;
        CyclicBarrierTest cyclicBarrierTest = new CyclicBarrierTest();
        CyclicBarrier barrier = new CyclicBarrier(mPeoples, new Runnable() {
            @Override
            public void run() {
                System.out.println("      ");
            }
        });
        for(int i=0;inew Thread(cyclicBarrierTest.new Eater(i+1,barrier)).start();
        }
    }
    class Eater implements Runnable{
        int peopleId;
        CyclicBarrier cb;
        public Eater(int peopleId, CyclicBarrier cb) {
            this.peopleId = peopleId;
            this.cb = cb;
        }
        @Override
        public void run() {
            try{
                System.out.println("    :"+peopleId+"     !");
                Thread.sleep((long)(Math.random() *3000));
                cb.await();
                System.out.println("    :"+peopleId+"     ");
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

出力結果を見てみましょう.
    :2:4:3:1:1     
    :4     
    :3     
    :2