1、倒计时器CountDownLatch

CountDownLatch是一个多线程控制工具类。通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行

构造函数:

public CountDownLatch(int count) //count 计数个数

例如:在主线程中启动10个子线程去数据库中获取分页数据,需要等到所有线程数据都返回之后统一做统计处理

public class CountDownLatchDemo implements Runnable{

private static final CountDownLatch end = new CountDownLatch(10);

@Override

public void run() {

System.out.println("线程名称:" + Thread.currentThread().getName());

//数据业务处理

end.countDown();//计数减1

}

public static void main(String[] args) {
CountDownLatchDemo countDownLatchDemo = new CountDownLatchDemo();
System.out.println("计数开始");
for (int i = 0; i < 10; i++) {
new Thread(countDownLatchDemo).start();
}
try {
end.await();
System.out.println("计数结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

上述代码使用CountDownLatch的await()方法,要求主线程等待所有10个计数任务全部完成后,主线程才开始继续执行
可以通过getCount()方法获取当前的计数个数,当计数结束时count为0,且不会被重置

2、循环栅栏CyclicBarrier

CyclicBarrier也是一种多线程并发控制的工具。相比CountDownLatch,CyclicBarrier功能更加强大,主要表现在:

1)构造方法:

public CyclicBarrier(int parties, Runnable barrierAction)

CyclicBarrier的构造方法可以传入一个Runnable的barrierAction,可用于线程集结完毕后做一件特定的事情

2)CyclicBarrier可以重复使用,当一批线程凑满parties个是,计数器会归零,重新开始计数

public class CyclicBarrierDemo {

class Soldier implements Runnable{
private CyclicBarrier cyclicBarrier;
public Soldier(CyclicBarrier cyclicBarrier){
this.cyclicBarrier = cyclicBarrier;
} @Override
public void run() {
System.out.println("士兵 " + Thread.currentThread().getId() + " 报道");
try {
//等待所有士兵到齐
cyclicBarrier.await();
//执行任务
doWork();
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
} private void doWork() throws InterruptedException {
Thread.sleep(1000);
System.out.println("士兵" + Thread.currentThread().getId()+ " 任务完成");
}
} class Commond implements Runnable{
@Override
public void run() {
System.out.println("任务结束");
}
} public static void main(String[] args) {
CyclicBarrierDemo cyclicBarrierDemo = new CyclicBarrierDemo();
CyclicBarrier cyclicBarrier = new CyclicBarrier(5, cyclicBarrierDemo.new Commond());
for (int i = 0; i < 20; i++) {
new Thread(cyclicBarrierDemo.new Soldier(cyclicBarrier)).start();
} }

}

执行结果:



可以看到,线程被分成了5个一组

多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier的更多相关文章

  1. 倒计时器CountDownLatch与同步屏障CyclicBarrier

    CountDownLatch CountDownLatch是一个非常实用的多线程控制工具类,这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束,再开始执行.在这里指CountDownL ...

  2. Java基础教程:多线程基础(5)——倒计时器(CountDownLatch)

    Java基础教程:多线程基础(5)——倒计时器(CountDownLatch) 引入倒计时器 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种 ...

  3. java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例

    这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...

  4. Java并发编程原理与实战二十七:循环栅栏:CyclicBarrier

    昨天我们学习了倒计数功能的等待,今天我们学习的是循环栅栏:CyclicBarrier.下面我们就开始吧: 1.CyclicBarrier简介CyclicBarrier,是JDK1.5的java.uti ...

  5. 24.循环栅栏 CyclicBarrier

    import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /** * ...

  6. 多线程控制工具类--倒计时器CountDownLatch的使用(模仿火箭发射)

    package com.thread.test.Lock; import java.util.Random; import java.util.concurrent.CountDownLatch; i ...

  7. Java多线程-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier

    Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁 ...

  8. 23.倒计时器CountDownLatch

    门闩是concurrent包中定义的一个类型,是用于多线程通讯的一个辅助类型. 门闩相当于在一个门上加多个锁,当线程调用await方法时,会检查门闩数量,如果门闩数量大于0,线程会阻塞等待. 当线程调 ...

  9. 倒计时器CountDownLatch

    1.背景: countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier.Semaphore.concurrentHashMap和BlockingQueu ...

随机推荐

  1. AnnotationUtils

    /** * 查询类中符合指定annotation的属性信息 * @param objCls 实体类 * @param annCls 注解类 * @return HashMap<实体属性名, An ...

  2. CocosCreator游戏开发---菜鸟学习之路(一)

    PS(废话): 辞职后在家好久好久了,久到经济不允许了,接着就准备再次出去找工作了,然而工作哪有那么好找,特别是像我这种菜鸟.而且我还准备转行,准备去做游戏,技能等级接近于0,那工作就更难找了.既然如 ...

  3. CENTOS6.6上搭建单实例ORACLE12C

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 自己在centos6.6上搭建的单实例oracle12c 由 ...

  4. vuejs、eggjs全栈式开发设备管理系统

    vuejs.eggjs全栈式开发简单设备管理系统 业余时间用eggjs.vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据至web端实时展现,包含设备参数分析.发送设备报警等模块.收获还是 ...

  5. ubuntu17 安装中文输入法

    在此说的是intelligent pinyin.我首先尝试的是搜狗输入法,虽然最终安装成功了,但还是直接卸载了.因为它不仅需要fcitx框架,在安装成功后,标题栏上面还会出现两个输入法图标.真正不能让 ...

  6. C#语言Devdevexpress控件chart在C/S框架中的使用

    声明.数据库连接机制框架已经写好.框架模式是MVC模式.就以我的from测试.我的做法是在查询页面创建一个按钮,然后在这个按钮上绑定一个点击事件.点击查询按钮把查询条件传到需要显示图例的页面.查询页面 ...

  7. hdu 2048 递推&&错排

    直接贴出递推公式: cnt[n]=(i-1)*(cnt[n-1]+cnt[n-2]); 数组保存的是失败的种数 AC代码: #include<cstdio> const int maxn= ...

  8. Enable multi-tenancy on ironic

    Multi-tenancy 是openstack ironic从Ocata版本开始支持的新特性,通过network-generic-switch插件控制交换机,Ironic可以实现在不同租户间机网络隔 ...

  9. django-装饰器实现PV统计

    1.models层建立统计表 # 每日访问量统计 class Statistics(models.Model): pv = models.IntegerField(default=0) uv = mo ...

  10. .net core 部署到 iis 步骤及报错解决方法

    我写了一个Asp.net core mvc项目,但是部署在iis发生了502.5的问题一直解决不了. 环境 系统:最强Win10; 工具:轻巧VS Code; 各种百度bing都没有我要的解决方案,说 ...