CyclicBarrier类

CyclicBarrier类用于处理多个线程相互等待。设置一个barrier,直到所有的barrier内所有的线程同时到达,barrier才打开,线程再继续向下执行。
(1)构造方法

  • CyclicBarrier(int parties)
    创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操作。
  • CyclicBarrier(int parties, Runnable barrierAction)
    创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。
    (2)成员方法
  • int await()
    在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
  • int await(long timeout, TimeUnit unit)
    在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。
  • int getNumberWaiting()
    返回当前在屏障处等待的参与者数目。
  • int getParties()
    返回要求启动此 barrier 的参与者数目。
  • boolean isBroken()
    查询此屏障是否处于损坏状态。
  • void reset()
    将屏障重置为其初始状态。
    例:启动4个线程,处理一个二维数组,每个线程统计数组一行的和,并打印出来,所有线程执行结束后,最后一个线程打印结束信息
public class CyclicBarrierService implements Runnable{
    private int[][] array;
    private int row;
    private CyclicBarrier barrier;
    public CyclicBarrierService(int[][] array,int row,CyclicBarrier barrier) {
        this.array = array;
        this.row=row;
        this.barrier=barrier;
    }
    public void handle(){
        System.out.println(Thread.currentThread().getName()+"开始处理");
        int sum=0;
        for(int i=0;i

测试:

public class ContainerTest2 {
    public static void main(String[] args) {
        final CyclicBarrier barrier=new CyclicBarrier(4,new Runnable(){
            public void run(){
                System.out.println(Thread.currentThread().getName()+"任务全部结束");
            }
        });
        final int[][] array={{1,2,3,4,5,6,7,8},{10,20,30,40,50,60,70,80},{100,200,300,400,500,600,700,800},{1000,2000,3000,4000,5000,6000,7000,8000}};
        for(int i=0;i<4;i++){
            new Thread(new CyclicBarrierService(array,i,barrier)).start();
        }
    }
}

执行结果:

Thread-0开始处理
Thread-1开始处理
Thread-2开始处理
Thread-3开始处理
Thread-2处理完第2行,结果为3600
Thread-1处理完第1行,结果为360
Thread-0处理完第0行,结果为36
Thread-3处理完第3行,结果为36000
Thread-3任务全部结束

你可能感兴趣的:(CyclicBarrier类)