CyclicBarrier循环路障
(1)概念
首先用通俗的话解释,表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指定地点集合碰面,这就好比整个公司的人员利用周末时间集体郊游一样,先各自从家出发到公司集合后,再同时出发到公园游玩,然后在指定地点集合后再同时开始就餐的场景。
CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该barrier 在释放等待线程后可以重用,所以称它为循环的barrier。
CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
样例代码:
之后创建了三个Runnable,每个Runnable都在一定时间内到达一个集合点,然后执行同步对象的await方法,来
实现各个线程任务互相等待直到全部达到一个集合点的时候再继续向下执行。
效果:
在日常项目开发中,如果需要一些线程同时到达一个点之后再继续各自运行,
(1)概念
首先用通俗的话解释,表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指定地点集合碰面,这就好比整个公司的人员利用周末时间集体郊游一样,先各自从家出发到公司集合后,再同时出发到公园游玩,然后在指定地点集合后再同时开始就餐的场景。
CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该barrier 在释放等待线程后可以重用,所以称它为循环的barrier。
CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
样例代码:
package cn.edu.hpu.test;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CyclicBarrierTest {
public static void main(String[] args){
ExecutorService service=Executors.newCachedThreadPool();
final CyclicBarrier cb=new CyclicBarrier(3);//创建三个线程循环路障对象
for (int i = 0; i < 3; i++) {
//创建三个一样的线程任务
Runnable runnable=new Runnable(){
public void run() {
try {
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程:"+Thread.currentThread().getName()+
"即将到达集合点1,当前已有"+(cb.getNumberWaiting()+1)+"个已经到达,"+
(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await();
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程:"+Thread.currentThread().getName()+
"即将到达集合点2,当前已有"+(cb.getNumberWaiting()+1)+"个已经到达,"+
(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await();
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程:"+Thread.currentThread().getName()+
"即将到达集合点3,当前已有"+(cb.getNumberWaiting()+1)+"个已经到达,"+
(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
首先利用Executors创建了一个缓存线程池(大小自适应),然后创建了3个CyclicBarrier对象,用于协调集合点,
之后创建了三个Runnable,每个Runnable都在一定时间内到达一个集合点,然后执行同步对象的await方法,来
实现各个线程任务互相等待直到全部达到一个集合点的时候再继续向下执行。
效果:
在日常项目开发中,如果需要一些线程同时到达一个点之后再继续各自运行,
可以使用CyclicBarr类来解决这类问题。
转载请注明出处:http://blog.csdn.net/acmman/article/details/52980880