java中的CyclicBarrier
来源:互联网 发布:常德市优化办内设机构 编辑:程序博客网 时间:2024/06/06 03:33
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。 如:一群人打算去游玩,大家彼此先等待,大家集合好后才开始出发,分散活动后又在i指定地点集合碰面,这就好比整个公司的人员利用周末时间集体郊游一样,先各自从家出发到公司集合后,再同时出发到公园游玩,在指定地点集合后再同时开始就餐……。在这里CyclicBarrier就非常有用。看代码(张孝祥视频学习笔记):
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?"都到齐了,继续走啊":"正在等候"));
try {
cb.await();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程"+Thread.currentThread().getName()+
"即将到达集合地点2,当前已有"+(cb.getNumberWaiting()+1)+"个已到达"+
(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
try {
cb.await();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程"+Thread.currentThread().getName()+
"即将到达集合地点3,当前已有"+(cb.getNumberWaiting()+1)+"个已到达"+
(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
try {
cb.await();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
运行结果:
线程pool-1-thread-3即将到达集合地点1,当前已有1个已到达正在等候
线程pool-1-thread-2即将到达集合地点1,当前已有2个已到达正在等候
线程pool-1-thread-1即将到达集合地点1,当前已有3个已到达都到齐了,继续走啊
线程pool-1-thread-1即将到达集合地点2,当前已有1个已到达正在等候
线程pool-1-thread-2即将到达集合地点2,当前已有2个已到达正在等候
线程pool-1-thread-3即将到达集合地点2,当前已有3个已到达都到齐了,继续走啊
线程pool-1-thread-2即将到达集合地点3,当前已有1个已到达正在等候
线程pool-1-thread-1即将到达集合地点3,当前已有2个已到达正在等候
线程pool-1-thread-3即将到达集合地点3,当前已有3个已到达都到齐了,继续走啊
线程中的锁存器CountDownLatch也能实现此效果,不太清楚此工具类的可以搜索相关内容了解一下:http://blog.csdn.net/chenleixing/article/details/42173593
- java中的CyclicBarrier
- Java多线程中的CyclicBarrier
- java并发中的CyclicBarrier
- java中的多线程包---CyclicBarrier
- Java中的CyclicBarrier和CountDownLatch
- java 线程 新类库中的构件 CyclicBarrier使用
- Java 编程下 CyclicBarrier 中的线程等待
- Java SE5中的CountDownLatch和CyclicBarrier类库
- java CyclicBarrier
- Java CyclicBarrier
- Java CyclicBarrier
- java CyclicBarrier
- java CyclicBarrier
- Java CyclicBarrier
- Java中的并发工具CountDownLatch、CyclicBarrier、Semapphore使用详解
- java.util.concurrent.CyclicBarrier
- JAVA多线程CyclicBarrier应用
- Java多线程之CyclicBarrier
- Linux awk命令
- 中介者模式(Mediator)
- POJ 3174 1001
- _UNICODE和UNICODE的区别
- java线程内存模型,线程、工作内存、主内存
- java中的CyclicBarrier
- iOS中静态库开发调用函数BUG
- nodejs中express 入门小实例
- DirectX 因素:模拟合成器的仿真
- 深入剖析 OC 中的方法结构 (isa指针的指向,以及元类的概念等)
- HDU 5289 Assignment [RMQ区间查询+二分搜索]
- VMware虚拟机与window共享目录
- 孙鑫Lesson5 text
- 给你一个:驱动程序A,数据源名称为B,用户名称为C,密码为D,数据库表为T,请用JDBC检索出表T的所有数据