栅栏CyclicBarrier和闭锁CountDownLatch类似,可以说它们都是用来计数,都能阻塞一组线程知道某个事件发生。不同的是闭锁用于等待事件,而栅栏用于等待其他线程。

在前一篇《CountDownLatch——闭锁的实现之一》中提到,在CountDownLatch里有一个计数器,一个线程完成一个任务后调用countdown方法使其计数器-1,等待线程则在执行方法前调用await方法,当CountDownLatch计数器减至0时将会放行的阻塞等待线程。那么CyclicBarrier所谓的等待其他线程是什么意思呢?

我们模拟一个任务线程:

 package cyclicbarrier;

 import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; /**
* Created by yulinfeng on 12/19/16.
*/
public class Task implements Runnable {
private final CyclicBarrier cyclicBarrier; public Task(CyclicBarrier cyclicBarrier){
this.cyclicBarrier = cyclicBarrier;
} @Override
public void run() {
try {
System.out.println(Thread.currentThread().getId() + " waiting");
cyclicBarrier.await(); //线程到达时将阻塞,只有当所有线程都到达时,才会打开栅栏
System.out.println(Thread.currentThread().getId() + " working");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}

接着我们看看测试代码,使用线程池开启5个线程:

 package cyclicbarrier;

 import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* Created by yulinfeng on 12/19/16.
*/
public class Test { public static void main(String[] args){
CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
//当所有线程到达时执行此线程
@Override
public void run() {
System.out.println("execute barrier");
}
}); ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++){
exec.execute(new Task(cyclicBarrier));
}
}
}

执行结果:

最新文章

  1. 自动化运维,远程交互从服务器A上ssh到服务器B上,然后执行服务器B上的命令。
  2. Could not create the view: An unexpected exception was thrown.
  3. 安装Hadoop系列 — 导入Hadoop源码项目
  4. HW4.26
  5. PagedList 分页
  6. Flask -- 内容管理系统
  7. LinkedList源码解读
  8. memcache 启动 储存原理 集群
  9. Linux上使用源代码安装软件
  10. 水课 or not
  11. Django学习手册 - 初识django
  12. Python练习题
  13. Mad LIbs小游戏
  14. MySQL 命令(导出数据):mysqldump
  15. python中urllib的整理
  16. linked-list-cycle (快慢指针判断是否有环)
  17. 为DataGridView增加鼠标滚轮功能
  18. 不包含数据和字母的Webshell
  19. cron Linux下的定时执行工具
  20. WinThruster清理电脑注册表

热门文章

  1. 【C++】智能指针详解(一):智能指针的引入
  2. 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 4
  3. 腾讯IVWEB团队:WebRTC 点对点直播
  4. php Redis常用命令
  5. JDBC基础学习(一)&mdash;JDBC的增删改查
  6. iOS图片填充UIImageView(contentMode)
  7. 【CSS】如何用css做一个爱心
  8. mpush 服务器环境配置安装 CentOS 7 and Windows
  9. Extjs6(二)——用extjs6.0写一个系统登录及注销
  10. 有关 json对象 取出其中数据问题