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<Runnable>());
//当拦截线程数达到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();
}
}
}
// 李明开始从宿舍出发
// 王强开始从宿舍出发
// 刘凯开始从宿舍出发
// 赵杰开始从宿舍出发
// 寝室四兄弟一起出发去球场
// 四个人一起到达球场,现在开始打球
// 王二开始从宿舍出发
// 雷兵开始从宿舍出发
// 洪光开始从宿舍出发
// 赵三开始从宿舍出发
// 寝室四兄弟一起出发去球场
// 四个人一起到达球场,表示愿意一起打球,现在八个人开始打球~~~