栅栏——CyclicBarrier
2024-10-11 19:50:26
栅栏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));
}
}
}
执行结果:
最新文章
- 自动化运维,远程交互从服务器A上ssh到服务器B上,然后执行服务器B上的命令。
- Could not create the view: An unexpected exception was thrown.
- 安装Hadoop系列 — 导入Hadoop源码项目
- HW4.26
- PagedList 分页
- Flask -- 内容管理系统
- LinkedList源码解读
- memcache 启动 储存原理 集群
- Linux上使用源代码安装软件
- 水课 or not
- Django学习手册 - 初识django
- Python练习题
- Mad LIbs小游戏
- MySQL 命令(导出数据):mysqldump
- python中urllib的整理
- linked-list-cycle (快慢指针判断是否有环)
- 为DataGridView增加鼠标滚轮功能
- 不包含数据和字母的Webshell
- cron Linux下的定时执行工具
- WinThruster清理电脑注册表
热门文章
- 【C++】智能指针详解(一):智能指针的引入
- 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 4
- 腾讯IVWEB团队:WebRTC 点对点直播
- php Redis常用命令
- JDBC基础学习(一)&mdash;JDBC的增删改查
- iOS图片填充UIImageView(contentMode)
- 【CSS】如何用css做一个爱心
- mpush 服务器环境配置安装 CentOS 7 and Windows
- Extjs6(二)——用extjs6.0写一个系统登录及注销
- 有关 json对象 取出其中数据问题