CyclicBarrier和CountDownLatch笔记
一、CyclicBarrier的使用
Barrier是栅栏,障碍物的意思,这里将它理解为栅栏。
Cyclic是重复利用的意思。
CyclicBarrier:可重复利用的栅栏。这里附上官方文档的一句解释:The barrier is called<em>cyclic</em> because it can be re-used after the waiting threads are released.
大概意思是等待的线程被释放以后就可以重新使用这个栅栏。
栅栏的使用条件:它必须使用在线程类中。也就是说你可以把CyclicBarrier作为线程类的一个变量。
在代码中插入一个栅栏,当代码执行到栅栏处就被拦截住了,不能继续往下执行。一直等到所有的线程都执行到栅栏处,才可以继续执行。

public static void main(String[] args)
{
CyclicBarrier barrier = new CyclicBarrier(10);//设置你要拦截的线程的个数。 for(int i = 0; i < 10; i++)
{
new Thread(new Worker(barrier)).start();
System.out.println("第" + i + "个线程已经启动"); }
}
线程类中持有CyclicBarrier的引用。
class Worker implements Runnable
{
private CyclicBarrier barrier; public Worker(CyclicBarrier barrier)
{
this.barrier = barrier;
} @Override
public void run()
{
try
{
Thread.sleep((long)(Math.random() * 10000));
} catch (InterruptedException e)
{
e.printStackTrace();
} try
{
System.out.println("代码....");
barrier.await();//栅栏,栅栏的启用就是调用await()方法就行了。还可以调用它的重载方法await(long timeout, TimeUnit unit)
System.out.println("代码.....");
} catch (InterruptedException e)
{
e.printStackTrace();
} catch (BrokenBarrierException e)
{
e.printStackTrace();
} System.out.println("你好");
}
}
二、CountDownLatch
感觉CountDownLatch和CyclicBarrier有点相似,所以就记在一起。
说一下两者的区别,CyclicBarrier的作用是让多个线程都执行到栅栏的时候,这写线程再继续执行,比如,有十个线程,要全部等到这十个线程都到栅栏以后,再各自前进。而CountDownLatch则是用来让多个线程都执行完以后再继续往下执行。比如,在一个主线程中创建了10个线程并启动运行它们。本来的是这十个线程启动完后主线程就可以继续往下执行了,但是现在需要等这十个线程执行完毕以后(更准确的说应该是getCount()的返回值为0的时候)主线程才能往下执行。那么这时候就需要CountDownLatch来完成。
例子:
public class CountDownLatchTest
{
public static void main(String[] args)
{
CountDownLatch countDownLatch = new CountDownLatch(5); for(int i = 0; i < 10; i++)
{
new Thread(new CountDownRun(countDownLatch, i)).start();
} //需要等到10个线程都执行完以后才能继续往下执行。准确的来说应该是计数器不断减一,当减到0的时候主线程就可以继续往下执行了。
try
{
countDownLatch.await();
} catch (InterruptedException e)
{
e.printStackTrace();
} System.out.println("await()之后继续执行");
}
}
class CountDownRun implements Runnable
{
private CountDownLatch countDownLatch;//线程持有同一个countDownLatch
private int i; public CountDownRun(CountDownLatch countDownLatch, int i)
{
this.countDownLatch = countDownLatch;
this.i = i;
} @Override
public void run()
{
System.out.println("你好!" + i); try
{
Thread.sleep((long)(Math.random() * 1000));
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("睡醒了。。。" + i);
countDownLatch.countDown();//减一
System.out.println("减一后");
}
}
三、CountDownLatch还有一种用法,参见类注释。
CyclicBarrier和CountDownLatch笔记的更多相关文章
- CyclicBarrier和CountDownLatch的差别
CyclicBarrier和CountDownLatch都用多个线程之间的同步,共同点:同时有N个线程在 CyclicBarrier(CountDownLatch) 等待上等待时,CyclicBarr ...
- Java并发之CyclicBarrier、CountDownLatch、Phaser
在Java多线程编程中,经常会需要我们控制并发流程,等其他线程执行完毕,或者分阶段执行.Java在1.5的juc中引入了CountDownLatch和CyclicBarrier,1.7中又引入了Pha ...
- 《java.util.concurrent 包源码阅读》21 CyclicBarrier和CountDownLatch
CyclicBarrier是一个用于线程同步的辅助类,它允许一组线程等待彼此,直到所有线程都到达集合点,然后执行某个设定的任务. 现实中有个很好的例子来形容:几个人约定了某个地方集中,然后一起出发去旅 ...
- 使用数据库乐观锁解决高并发秒杀问题,以及如何模拟高并发的场景,CyclicBarrier和CountDownLatch类的用法
数据库:mysql 数据库的乐观锁:一般通过数据表加version来实现,相对于悲观锁的话,更能省数据库性能,废话不多说,直接看代码 第一步: 建立数据库表: CREATE TABLE `skill_ ...
- JAVA多线程提高十:同步工具CyclicBarrier与CountDownLatch
今天继续学习其它的同步工具:CyclicBarrier与CountDownLatch 一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公 ...
- java多线程开发之CyclicBarrier,CountDownLatch
最近研究了一个别人的源码,其中用到多个线程并行操作一个文件,并且在所有线程全部结束后才进行主线程后面的处理. 其用到java.util.concurrent.CyclicBarrier 这个类. Cy ...
- JDK源码分析之concurrent包(四) -- CyclicBarrier与CountDownLatch
上一篇我们主要通过ExecutorCompletionService与FutureTask类的源码,对Future模型体系的原理做了了解,本篇开始解读concurrent包中的工具类的源码.首先来看两 ...
- CyclicBarrier及CountDownLatch的使用
CountDownLatch位于java.util.concurrent包下,是JDK1.5的并发包下的新特性. 首先根据Oracle的官方文档看看CountDownLatch的定义: A synch ...
- Android进阶——多线程系列之Semaphore、CyclicBarrier、CountDownLatch
今天向大家介绍的是多线程开发中的一些辅助类,他们的作用无非就是帮助我们让多个线程按照我们想要的执行顺序来执行.如果我们按照文字来理解Semaphore.CyclicBarrier.CountDownL ...
随机推荐
- tomcat的8088端口被占用
打开Dos:windows->输入cmd(想必这个都会) 在黑窗口中输入指令:netstat -ano | findstr 8080 指令的意思是找出占用8080端口的进程pid 再 ...
- TypeScript 乱糟笔记
数组头上插一个值. var arr: Array<String> = ['a', 'b', 'c'];arr.unshift('d'); object删除元素. var obj: Obje ...
- Cheatsheet: 2018 04.01 ~ 04.30
Web Writing VS Code Extensions with TypeScript Docker How to write excellent Dockerfiles Raspberry P ...
- linux下配置环境变量方式
linux下配置环境变量有多种方式,下面简述之 方式1.编辑 /etc/profile 文件,增加如下内容 JAVA_HOME=/usr/local/jdk1. export JAVA_HOME PA ...
- MySQL数据库的备份与恢复命令
1.数据库导出SQL脚本 启动MySQL服务器 输入:mysqldump -u root -p 数据库名>生成脚本文件路径 输入登录密码,回车键 例如: $ mysql.server star ...
- 【Chromium】sandboxed window问题记录
问题发现 在业务逻辑中发现有时使用chrome.app.window.create这个API创建出来的窗口无法使用其他的API,不仅其他chrome.app.window的API说window is ...
- 01.CSS动画-->transform
transform: translate(参数1,参数2):让元素在X轴与Y轴方向发生偏移-->参数1:X:参数2:Y rotate(参数1):让元素进行旋转:单位(deg) scale(参数1 ...
- jQuery轮播图(二)利用构造函数和原型创建对象以实现继承
本文是在我开始学习JavaScript继承时,对原型继承的一些理解和运用.文中所述的继承方式均是使用js特有的原型链方式,实际上有了ES6的类之后,实现继承的就变得十分简单了,所以这种写法现在也不在推 ...
- CentOS6.5(4)----宿主机无法访问虚拟机中的web服务解决方案
宿主机无法访问虚拟机中的web服务 在Windows7宿主机中的VMware虚拟机中安装了CentOS6.5操作系统,并且基于Nginx搭建了Web服务器,网页刚刚搭建好的时候,通过宿主机的浏览器可以 ...
- Function Object in C++
Function object is very userful to use member function or non-member function as callback mechanism, ...