CyclicBarrier:循环屏障
当await()线程数达到指定屏障数,await()后面的代码才会执行;
如果new CyclicBarrier(5,new CollectThread())传了第二个参数,当await()线程数达到指定屏障数,第二个参数的线程也会执行
核心代码:
private static CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new CollectThread());
cyclicBarrier.await();
CountDownLatch和CyclicBarrier的异同点:
相同点:都可作为线程的计数器使用
不同点:CountDownLatch当线程数扣除到0时执行await()后面的代码;
CyclicBarrier当屏障数达到指定数为执行await()后面的代码
案例
/**
* 类说明:演示CyclicBarrier用法,共4个子线程,他们全部完成工作后,交出自己结果,
* 再被统一释放去做自己的事情,而交出的结果被另外的线程拿来拼接字符串
*/
public class UseCyclicBarrier {
//子线程达到5就会执行await后面的代码;第二个参数可为空,空就没有汇总线程
private static CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new CollectThread());
//存放线程工作结果的容器
private static ConcurrentHashMap<String, Long> resultMap = new ConcurrentHashMap<>();
public static void main(String[] args) {
//相互等待的5个子线程
for (int i = 0; i <= 4; i++) {
Thread thread = new Thread(new SubThread());
thread.start();
}
}
//相互等待的子线程
private static class SubThread implements Runnable {
@Override
public void run() {
long id = Thread.currentThread().getId();
resultMap.put(Thread.currentThread().getId() + "", id);
try {
Thread.sleep(1000 + id);
System.out.println("子线程:Thread_" + id + " ....do something ");
cyclicBarrier.await();
Thread.sleep(1000 + id);
System.out.println("子线程:Thread_" + id + " ....do its business ");
} catch (Exception e) {
e.printStackTrace();
}
}
}
//汇总的任务
private static class CollectThread implements Runnable {
@Override
public void run() {
StringBuilder result = new StringBuilder();
for (Map.Entry<String, Long> workResult : resultMap.entrySet()) {
result.append("[").append(workResult.getValue()).append("]");
}
System.out.println("汇总线程:the result = " + result);
System.out.println("汇总线程 do other business........");
}
}
}