CyclicBarrier和CountDownLatch区别
这两天写多线程时,用到了CyclicBarrier,下意识的认为CyclicBarrier和CountDownLatch作用很像,就翻阅资料查了一下,说一下他们的区别吧
CyclicBarrier和CountDownLatch 都位于java.util.concurrent 这个包下
CountDownLatch | CyclicBarrier |
减计数方式 | 加计数方式 |
计算为0时释放所有等待的线程 | 计数达到指定值时释放所有等待线程 |
计数为0时,无法重置 | 计数达到指定值时,计数置为0重新开始 |
调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响 | 调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞 |
不可重复利用 | 可重复利用 |
一、CountDownLatch用法
CountDownLatch类只提供了一个构造器:
- public CountDownLatch(int count) { }; //参数count为计数值
然后下面这3个方法是CountDownLatch类中最重要的方法:
- public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
- public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
- public void countDown() { }; //将count值减1
CountDownLatch, 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
下面举个例子说明:
- package main.java.CountDownLatch;
- import java.util.concurrent.CountDownLatch;
- /**
- * PROJECT_NAME:downLoad
- * Author:lucaifang
- * Date:2016/3/18
- */
- public class countDownlatchTest {
- public static void main(String[] args) throws InterruptedException {
- CountDownLatch countDownLatch = new CountDownLatch(5);
- for(int i=0;i<5;i++){
- new Thread(new readNum(i,countDownLatch)).start();
- }
- countDownLatch.await();
- System.out.println("线程执行结束。。。。");
- }
- static class readNum implements Runnable{
- private int id;
- private CountDownLatch latch;
- public readNum(int id,CountDownLatch latch){
- this.id = id;
- this.latch = latch;
- }
- @Override
- public void run() {
- synchronized (this){
- System.out.println("id:"+id);
- latch.countDown();
- System.out.println("线程组任务"+id+"结束,其他任务继续");
- }
- }
- }
- }
输出结果:
id:1
线程组任务1结束,其他任务继续
id:0
线程组任务0结束,其他任务继续
id:2
线程组任务2结束,其他任务继续
id:3
线程组任务3结束,其他任务继续
id:4
线程组任务4结束,其他任务继续
线程执行结束。。。。
线程在countDown()之后,会继续执行自己的任务,而CyclicBarrier会在所有线程任务结束之后,才会进行后续任务,具体可以看下面例子。
二、CyclicBarrier用法
CyclicBarrier提供2个构造器:
- public CyclicBarrier(int parties, Runnable barrierAction) {
- }
- public CyclicBarrier(int parties) {
- }
参数parties指让多少个线程或者任务等待至barrier状态;参数barrierAction为当这些线程都达到barrier状态时会执行的内容。
CyclicBarrier中最重要的方法就是await方法
- public int await() throws InterruptedException, BrokenBarrierException { };//挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务;
- public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException { };//让这些线程等待至一定的时间,如果还有线程没有到达barrier状态就直接让到达barrier的线程执行后续任务
举例说明
- package main.java.countOff;
- import java.util.concurrent.CyclicBarrier;
- /**
- * PROJECT_NAME:downLoad
- * Author:lucaifang
- * Date:2016/3/18
- */
- public class cyclicBarrierTest {
- public static void main(String[] args) throws InterruptedException {
- CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
- @Override
- public void run() {
- System.out.println("线程组执行结束");
- }
- });
- for (int i = 0; i < 5; i++) {
- new Thread(new readNum(i,cyclicBarrier)).start();
- }
- //CyclicBarrier 可以重复利用,
- // 这个是CountDownLatch做不到的
- // for (int i = 11; i < 16; i++) {
- // new Thread(new readNum(i,cyclicBarrier)).start();
- // }
- }
- static class readNum implements Runnable{
- private int id;
- private CyclicBarrier cyc;
- public readNum(int id,CyclicBarrier cyc){
- this.id = id;
- this.cyc = cyc;
- }
- @Override
- public void run() {
- synchronized (this){
- System.out.println("id:"+id);
- try {
- cyc.await();
- System.out.println("线程组任务" + id + "结束,其他任务继续");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
输出结果:
id:1
id:2
id:4
id:0
id:3
线程组执行结束
线程组任务3结束,其他任务继续
线程组任务1结束,其他任务继续
线程组任务4结束,其他任务继续
线程组任务0结束,其他任务继续
线程组任务2结束,其他任务继续
CyclicBarrier和CountDownLatch区别相关推荐
- 16_张孝祥_多线程_同步工具CyclicBarrier与CountDownLatch
转载: CyclicBarrier的用法 CountDownLatch(倒计时计数器)使用说明 参考: CyclicBarrier和CountDownLatch区别 CyclicBarrier Cyc ...
- 请简要说明一下CyclicBarrier和CountDownLatch的区别?
请简要说明一下CyclicBarrier和CountDownLatch的区别? CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们的侧重点不同: ①Count ...
- Countdownlatch、CyclicBarrier、join区别
1.join 模拟现在有三个worker,采用join的方法控制: package org.pbccrc.org.pbccrc.thread;public class Test {public sta ...
- CyclicBarrier和CountDownLatch的用法与区别
前言 CyclicBarrier和CountDownLatch这两个工具都是在java.util.concurrent包下,并且平时很多场景都会使用到. 本文将会对两者进行分析,记录他们的用法和区别. ...
- CyclicBarrier和CountDownLatch使用上的区别
2018.12.12更新 在学习了CyclicBarrier之后发现,CyclicBarrier也可以实现跟CountDownLatch类似的功能,只需要在它的parties中多设置一个数,将主线程加 ...
- Java多线程学习三十五: CyclicBarrier 和 CountDownLatch 有什么不同
CyclicBarrier 和 CountDownLatch 有什么不同? CyclicBarrier作用 CyclicBarrier 和 CountDownLatch 确实有一定的相似性,它们都能阻 ...
- Java并发编程之CyclicBarrier和CountDownLatch
1.CyclicBarrier简介 CyclicBarrier(栅栏):拦截一组线程并使其阻塞,直到其内部的计数器归零,再唤醒所有的阻塞线程继续执行任务. 基础属性 public class Cycl ...
- CyclicBarrier 和CountDownLatch使用详解
http://xijunhu.iteye.com/blog/713433 http://www.blogjava.net/jlins-you/archive/2012/04/24/376516.htm ...
- CyclicBarrier及CountDownLatch的使用
CountDownLatch位于java.util.concurrent包下,是JDK1.5的并发包下的新特性. 首先根据Oracle的官方文档看看CountDownLatch的定义: A synch ...
最新文章
- Boruvka求最小生成树
- Oracle单机版开机自启动
- 如何安装docker-compose
- HTML5 拖拽的简单实践
- 自己写的sqlHelper 以及读取配置文件
- 批量迁移oracle表存储
- html 纯css 树形结构,纯css实现树形结构方法教程
- 非常有趣的古越及吴语-台州话
- MySQL instr()函数
- C++一天一个程序(八)
- 白话说编程之java线程
- w7如何调出计算机图标来,W7电脑系统怎么显示桌面图标
- Spring中获取泛型类型
- 《推荐系统笔记(四)》svd的python计算实例
- SENSOR DVP接口介绍
- 美股-史考特(Scottrade)开户详细说明
- php生成pdf中文断码_php在线生成pdf中文乱码完美解决“ | 学步园
- el-input输入11位手机号,边输入边验证手机号码格式
- 数据库系统原理选择题总结
- 大象流的危害以及处理