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 ...
随机推荐
- WordPress主题开发:主题初始化
在最简单的情况下,一个WordPress主题由两个文件构成: index.php ------------------主模版 style.css -------------------主样式表(注意 ...
- 解读MySQL的慢日志
完整的慢日志格式一般如下: # Time: :: # User@Host: db_user[db_database] @ localhost [] # Query_time: Rows_examine ...
- SSIS教程:创建简单的ETL包 -- 3. 添加日志(Adding Logging)
Microsoft Integration Services 包含日志记录功能,可通过提供任务和容器事件跟踪监控包执行情况以及进行故障排除. 日志记录功能非常灵活,可以在包级别或在包中的各个任务和容器 ...
- jQuery Ajax实例 ($.ajax_$.post_$.get)
Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作,不用考虑浏览器的诧异了. $.post.$.get是一些简单的方法,如果要处理复杂的逻辑,还是需要用到j ...
- 【10】Quartz.net 定时服务实例
一.安装nuget包 Install-Package Quartz Install-Package Common.Logging.Log4Net1211 Install-Package log4net ...
- 十一、curator recipes之联锁InterProcessMultiLock
简介 curator实现了一个类似容器的锁InterProcessMultiLock,它可以把多个锁包含起来像一个锁一样进行操作,简单来说就是对多个锁进行一组操作.当acquire的时候就获得多个锁资 ...
- 六、curator recipes之屏障barrier
简介 curator针对分布式场景实现了分布式屏障:barrier.我们在分布式系统中可以使用barrier去阻塞进程,知道某个条件被触发.其实跟Java多线程的barrier是一样的. 例如:当两个 ...
- 【原】Spring和Dubbo基于XML配置整合过程
背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只需一个 ...
- JavaMail获取已发送邮件
public static void main(String args[]) { Properties props = new Properties(); // 参数配置 props.setPrope ...
- 5.Resource注解解析
Resource有两种使用场景 1.Resource 当Resource后面没带参数的时候是根据它所注释的属性名称到applicationContext.xml文件中查找是否有bean的id与之匹配, ...