java编程思想笔记-并发之CyclicBarrier
来源:互联网 发布:闪电站小猪知乎 编辑:程序博客网 时间:2024/04/29 16:50
CyclicBarrier和CountDownLatch类似,可以让一组任务并行的工作,然后在下一个步骤之前等待,直至所有的任务完成,但是CountDownLatch只触发一次事件,而CyclicBarrier可以多次重用
示例:
赛马游戏
class Horse implements Runnable{ private static int counter=0; //赛马id private final int id=counter++; //总步长 private int strides=0; private static Random random=new Random(47); //栅栏 private static CyclicBarrier barrier; public Horse(CyclicBarrier b){ barrier=b; } public synchronized int getStrides() { return strides; } @Override public void run() { try { while (!Thread.interrupted()) { synchronized (this) { strides+=random.nextInt(3); } barrier.await(); } } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public String toString() { return "House "+id+" "; } public String tracks(){ StringBuilder sb=new StringBuilder(); for (int i = 0; i <getStrides(); i++) { sb.append("*"); } sb.append(id); return sb.toString(); }}public class HouseRace { static final int FINISH_LINE=75; private List<Horse>horses=new ArrayList<Horse>(); private ExecutorService exec=Executors.newCachedThreadPool(); private CyclicBarrier barrier; public HouseRace(int nHorses,final int pause){ barrier=new CyclicBarrier(nHorses, new Runnable() { @Override public void run() { StringBuilder sb=new StringBuilder(); for (int i = 0; i < FINISH_LINE; i++) { sb.append("="); } System.out.println(sb); for (Horse horse : horses) { System.out.println(horse.tracks()); } for (Horse horse : horses) { if (horse.getStrides()>=FINISH_LINE) { System.out.println(horse+" won "); exec.shutdownNow(); return ; } } try { TimeUnit.MILLISECONDS.sleep(pause); } catch (InterruptedException e) { e.printStackTrace(); } } }); for (int i = 0; i < nHorses; i++) { Horse horse=new Horse(barrier); horses.add(horse); exec.execute(horse); } } public static void main(String[] args) { int nHorses=7; int pause=200; new HouseRace(nHorses, pause); }}
所有的赛马线程每跑一次都被挂起,直到所有的赛马都处于栅栏处等待的时候,并且栅栏调用完barriarAction(CyclicBarrier初始化的第二个参数runnable)run()方法后,打破栅栏继续运行
阅读全文
0 0
- java编程思想笔记-并发之CyclicBarrier
- java并发编程之CyclicBarrier
- JAVA并发编程之 CyclicBarrier
- java并发编程之CyclicBarrier
- Java并发编程之CyclicBarrier
- Java并发编程之CyclicBarrier
- java编程思想笔记-并发之死锁
- java编程思想笔记-并发之CountDownLatch
- Java并发编程之栅栏(CyclicBarrier)详解
- Java并发编程之CyclicBarrier的使用
- java并发编程之CountDownLatch与CyclicBarrier
- Java并发编程--CyclicBarrier
- java编程思想笔记-并发之并发锁(一)
- Java并发之CyclicBarrier
- Java并发之CyclicBarrier
- java 并发之 CyclicBarrier
- 并发(java编程思想)笔记
- JAVA编程思想笔记--并发
- Python中isinstance用法
- Linux进程入门学习(二)-基础知识
- Linux下根据函数名查找所在文件
- MySQL性能优化之参数配置
- TCP协议的客服端 服务器
- java编程思想笔记-并发之CyclicBarrier
- Configuration注解类 Bean解析顺序
- Servlet---ServletRequest和ServletResponse(2)
- javaSE的最后----反射
- 珠心算测验
- 关于C++中的虚拟继承的一些总结
- mac osx Qt5.6.2 连接mysql 提示QMYSQL driver not loaded
- 随便写一个,证明我还活着
- js checkbox 全选和反选