1、倒计时器CountDownLatch

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

构造函数:

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

  1. 例如:在主线程中启动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

}

  1. public static void main(String[] args) {
  2. CountDownLatchDemo countDownLatchDemo = new CountDownLatchDemo();
  3. System.out.println("计数开始");
  4. for (int i = 0; i < 10; i++) {
  5. new Thread(countDownLatchDemo).start();
  6. }
  7. try {
  8. end.await();
  9. System.out.println("计数结束");
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. }

}

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

2、循环栅栏CyclicBarrier

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

1)构造方法:

public CyclicBarrier(int parties, Runnable barrierAction)

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

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

public class CyclicBarrierDemo {

  1. class Soldier implements Runnable{
  2. private CyclicBarrier cyclicBarrier;
  3. public Soldier(CyclicBarrier cyclicBarrier){
  4. this.cyclicBarrier = cyclicBarrier;
  5. }
  6. @Override
  7. public void run() {
  8. System.out.println("士兵 " + Thread.currentThread().getId() + " 报道");
  9. try {
  10. //等待所有士兵到齐
  11. cyclicBarrier.await();
  12. //执行任务
  13. doWork();
  14. cyclicBarrier.await();
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. } catch (BrokenBarrierException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. private void doWork() throws InterruptedException {
  22. Thread.sleep(1000);
  23. System.out.println("士兵" + Thread.currentThread().getId()+ " 任务完成");
  24. }
  25. }
  26. class Commond implements Runnable{
  27. @Override
  28. public void run() {
  29. System.out.println("任务结束");
  30. }
  31. }
  32. public static void main(String[] args) {
  33. CyclicBarrierDemo cyclicBarrierDemo = new CyclicBarrierDemo();
  34. CyclicBarrier cyclicBarrier = new CyclicBarrier(5, cyclicBarrierDemo.new Commond());
  35. for (int i = 0; i < 20; i++) {
  36. new Thread(cyclicBarrierDemo.new Soldier(cyclicBarrier)).start();
  37. }
  38. }

}

执行结果:



可以看到,线程被分成了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. js中sum(2,3,4)和sum(2)(3)(4)都返回9并要求扩展性

    网上有很多关于sum(1)(2)(3),sum(1,2,3)之类的面试题要求输出相同的结果6并要求可以满足扩展,即有多个参数时也能符合题设的要求,所以自己写了部分例子可以大概满足这些面试题的要求 &l ...

  2. Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户

    <Windows Azure Platform 系列文章目录> 本文的最后更新时间为:2017-12-27 本文介绍国内用户,注册和使用海外Azure账户. 前提: 1.需要一个有效的Wi ...

  3. 使用TransactionScope(轻量级事务)实现数据库操作事务

    TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间.它的用途是为数据库访问提供了一个"轻量级"[区别于:SqlTransaction]的 ...

  4. Visual Studio Code 调整字体大小

    { "editor.fontSize": 14, "window.zoomLevel": 1, } // 将设置放入此文件中以覆盖默认设置 { , , #代码字 ...

  5. docker 报错:x509: certificate has expired or is not yet valid

    环境:centos 7 程序:docker 下载镜像报错: # docker pull centos Pulling repository centos FATA[0004] Get https:// ...

  6. C# decimal 去掉小数点后的无效0

    c#去掉小数点后的无效0 decimal d = 0.0500m; d.ToString("0.##")就出来了 也可以这样 string.Format("{0:0.## ...

  7. Spring MVC 原理

    一.什么是springmvc springMVC是spring框架的一个模块,springMVC和spring无需通过中间整合层进行开发. springMVC是一个基于mvc的web框架. Sprin ...

  8. SpringMvc出现Jsp页面不能正常解析成html网页

    <!-- Spring mvc配置 --> <servlet> <servlet-name>springMvc</servlet-name> <s ...

  9. java2 - 语言基础

    一.结构流程图制作工具 xmind 的使用 二.Java 基础数据类型 回答以下问题: java 基本数据类型有几种? 整数类型是哪几种? 浮点数类型是哪几种? 字符类型关键字? 布尔类型关键字? 为 ...

  10. PendingIntent

    PendingIntent表示一种即将发生的意图,和Intent的区别在于:PendingIntent是在将来的某个不确定的时刻发生,而Intent是立刻发生 典型使用场景是给RemoteViews添 ...