CyclicBarrier

CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。

CyclicBarrier和CountDownLatch的区别

CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset() 方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。
CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。

实例

package com.example.java_lib;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.*;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.*;
public class CyclicBarrierDemo {
    private static final ThreadPoolExecutor threadPool=new ThreadPoolExecutor(4,10,60,TimeUnit.SECONDS,new LinkedBlockingQueue());
    //当拦截线程数达到4时,便优先执行barrierAction,然后再执行被拦截的线程。
    private static final CyclicBarrier cb=new CyclicBarrier(4,new Runnable() {
        public void run()
        {
            System.out.println("寝室四兄弟一起出发去球场");
        }
    });
    private static class GoThread extends Thread{
        private final String name;
        public GoThread(String name)
        {
            this.name=name;
        }
        public void run()
        {
            System.out.println(name+"开始从宿舍出发");
            try {
                Thread.sleep(1000);
                cb.await();//拦截线程

            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
            catch(BrokenBarrierException e)
            {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        String[] str= {"李明","王强","刘凯","赵杰"};
        String[] str1= {"王二","洪光","雷兵","赵三"};
        for(int i=0;i<4;i++)
        {
            threadPool.execute(new GoThread(str[i]));
        }
        try
        {
            Thread.sleep(4000);
            System.out.println("四个人一起到达球场,现在开始打球");

        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }
        //进行复用:
        for(int i=0;i<4;i++)
        {
            threadPool.execute(new GoThread(str1[i]));
        }
        try
        {
            Thread.sleep(4000);
            System.out.println("四个人一起到达球场,表示愿意一起打球,现在八个人开始打球");
            //System.out.println("现在对CyclicBarrier进行复用");
        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }

 
    }
 
}

//  李明开始从宿舍出发
//          王强开始从宿舍出发
//  刘凯开始从宿舍出发
//          赵杰开始从宿舍出发
//  寝室四兄弟一起出发去球场
//  四个人一起到达球场,现在开始打球
//          王二开始从宿舍出发
//  雷兵开始从宿舍出发
//          洪光开始从宿舍出发
//  赵三开始从宿舍出发
//          寝室四兄弟一起出发去球场
//  四个人一起到达球场,表示愿意一起打球,现在八个人开始打球~~~

你可能感兴趣的:(CyclicBarrier)