线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发.

1.效果如下:

2.实现代码:

package com.amos.concurrent;

import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* @ClassName: CyclicBarrierTest
* @Description: 线程同步工具类,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发,日常应用中较少涉及
* @author: amosli
* @email:hi_amos@outlook.com
* @date Apr 25, 2014 1:35:34 AM
*/
public class CyclicBarrierTest {
public static void main(String[] args) {
final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
for(int i=0;i<3;i++){
Runnable runnable = new Runnable() {
public void run() {
try {
Thread.sleep(new Random().nextInt(1000));
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合点1"+",当前已有"+(cyclicBarrier.getNumberWaiting()==2?(cyclicBarrier.getNumberWaiting()+1)+"人,人数已经集合完毕,即将向下一站进发":(cyclicBarrier.getNumberWaiting()+1)+"人"));
try {
cyclicBarrier.await();
} catch (Exception e1) {
e1.printStackTrace();
} try {
Thread.sleep(new Random().nextInt(1000));
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合点2"+",当前已有"+(cyclicBarrier.getNumberWaiting()==2?(cyclicBarrier.getNumberWaiting()+1)+"人,人数已经集合完毕,即将向下一站进发":(cyclicBarrier.getNumberWaiting()+1)+"人"));
try {
cyclicBarrier.await();
} catch (Exception e1) {
e1.printStackTrace();
} }
};
newCachedThreadPool.execute(runnable);
}
newCachedThreadPool.shutdown();
}
}

3.用法:

1),如何创建?

CyclicBarrier cyclicBarrier = new CyclicBarrier((int parties);
CyclicBarrier cyclicBarrier =new CyclicBarrier(int parties, Runnable barrierAction)

2).如何控制线程到一个集结点?

cyclicBarrier.await();

调用await()方法即可.

同时可以设置最长待时间,只需要调用await(long timeout, TimeUnit unit)方法即可.

3)如何打破障碍?

breakBarrier(); 

调用breakBarrier() 方法将可以打破当前的障碍.

如果看其内部实现方法不难发现关于Lock锁的应用.

最新文章

  1. DevOps的基本原则与介绍
  2. 当C++学到第20天的时候我崩溃了(找回刚开始的激情)
  3. Asp.Net缓存(1)
  4. 总结iframe高度自适应,自适应子页面高度
  5. Html中src、href的相对路径与绝对路径
  6. Windows Phone开发(17):URI映射
  7. spark 中的RDD编程 -以下基于Java api
  8. 聊聊C#与冲顶大会
  9. TDD入门demo
  10. git客户端保存用户名密码
  11. 一文读懂SpringCloud与Eureka,Feign,Ribbon,Hystrix,Zuul核心组件间的关系
  12. 【转】flannel网络的VXLAN及host-gw
  13. WebSocket学习与使用
  14. Tomcat三种项目部署方式
  15. 【Canal源码分析】数据传输协议
  16. 【C#小知识】C#中一些易混淆概念总结(五)---------深入解析C#继承
  17. Android自定义View实现仿QQ实现运动步数效果
  18. 对OpenCV中seamlessClone的初步实验
  19. T-SQL 之 存储过程
  20. oracle的常规操作(基本命令)

热门文章

  1. Content is not allowed in prolog.解决方法
  2. jquery获得图片的真实大小
  3. shiro 标签
  4. 将WeX5部署到自己的Tomcat服务器上
  5. [uboot]E9-i.MX6Q-uboot移植
  6. [MySQL] 关系型数据库的设计范式 1NF 2NF 3NF BCNF
  7. .tar.gz文件和.rpm文件的区别
  8. EXT 省市三级联动及默认选择
  9. tiny学习3
  10. CSS3属性transition