如题 (总结要点 ,看不懂下面有更多解释, 参考书籍《Java并发编程实战》)

  • CountDownLatch 倒计数门闩器
  • 让1-n-1个线程等待主线程完成工作。(Excel的多个Sheet的解析,最终等待解析完毕后;要实现主线程等待所有线程完成sheet解析操作,最简单的就是join )

    常用API
  • CountDownLatch latch = new CountDownLatch(2); // 新建一个倒计数门闩器 ,常用于迫使主线程进入等待 ;设置N个结点 ,n个线程或者步骤
  • latch.countDown(); // 计数器-1
  • latch.await(1000, TimeUnit.MILLISECONDS); //阻塞当前线程(常为主线程),直到计数器变为0

    区分

    • CyclicBarrier循环栅栏,维持最低的并发,让多个线程同时并发执行。每调用一次await()方法都将使阻塞的线程数+1,只有阻塞的线程数达到设定值时屏障才会打开,允许阻塞的所有线程继续执行。

适用场景总结

例子一

  • 比如导出一份Excel, 共有10万行, 拆分出10K行 * 10个线程来解析(导入/导出)处理; 主线程来创建(或提交)任务并分配10个新线程来处理;
  • 由于主线程分配完任务后就继续往下执行了, 其他的那10个新的线程还需要等待一段时间; 那这段时间差怎么处理??
  • Excel的多个Sheet的解析,最终等待解析完毕后再进行汇总处理, 主线程需要进行汇总处理, 那么就使用CountDownLatch 倒计数门闩器,来处理就很合理了.

例子二

  • 需要分别统计 sort_id 为1-1万的某个表的字段数量, 使用多线程处理,调用10个线程并发统计,每个统计%K的范围; 倒计数门闩就很合适, 最后处理完了,主线程再进行处理/封装再返回.
  • 依次类推

常用api

//构造器, 参数count为计数值
public CountDownLatch(int count) { }; //调用await()方法的线程会被挂起(一般是主线程),它会等待直到count值为0才继续执行
public void await() throws InterruptedException { }; //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //将count值减1
public void countDown() { };

1.测试1 简单测试


public class Test03_countdownlatch {
public static void main(String[] args) { Runnable runnable = new Runnable() {
@Override
public void run() {
// 睡眠可以开启, Thread.sleep(1000L);
System.out.println("hello ");
}
};
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
System.out.println("all thread finish");
}
}

2. 结果1 : 线程还没有来得及执行完毕,主线程就结束了(JVM关闭了),所以先打印的finish ; 如果子线程数量更多的话, 子线程就不一定能打印完.自己试试! 或者

all thread finish
hello
hello

3.测试2 迫使主线程通过子线程的join方法等待当前的子线程执行完毕

 public static void main(String[] args) {

        Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("hello ");
}
};
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable); thread1.start();
thread2.start(); try {
// 迫使主线程通过join方法等待当前的子线程执行完毕
thread1.join();
// 主线程第二次等待
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("all thread finish");
}

测试结果2

hello
hello
all thread finish

测试3 使用倒计数门闩器

public static void main(String[] args) {

        Runnable runnable = () -> System.out.println("hello ");
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable); // 使用倒计数门闩器 ,迫使主线程进入等待 ;设置N个结点 ,n个线程或者步骤都可以
CountDownLatch latch = new CountDownLatch(2);
thread1.start();
latch.countDown();
thread2.start();
latch.countDown(); try {
// 阻塞当前线程,直到计数器变为0; await(long time);也可以带时间!
latch.await(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("all thread finish"); }

测试结果3

hello
hello
all thread finish

Java并发编程-JUC-CountDownLatch 倒计数门闩器-等待多线程完成再放行 -一次性使用的更多相关文章

  1. java并发编程_CountDownLanch(倒计数锁存器)应用场景

    使用介绍: 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在 ...

  2. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  3. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore (总结)

    下面对上面说的三个辅助类进行一个总结: 1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待 ...

  4. 14、Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  5. 【转】Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore   Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在j ...

  6. java并发编程JUC第九篇:CountDownLatch线程同步

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

  7. java并发编程JUC第十篇:CyclicBarrier线程同步

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

  8. Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore

    原文出处: 海子 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅 ...

  9. Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore[转]

    [转载]http://www.cnblogs.com/dolphin0520/p/3920397.html 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDow ...

随机推荐

  1. Configuration类的@Value属性值为null

    今天写的Configuration类的@Value属性值为null @Configuration public class MybatisConfigurer { @Value("${spr ...

  2. expect脚本自动获取root权限

    Linux脚本中有很多场景是进行远程操作的,例如远程登录ssh.远程复制scp.文件传输sftp等.这些命令中都会涉及到安全密码的输入,正常使用命令时是需要人工手动输入密码并接受安全验证的.为了实现自 ...

  3. 理解Spring中的IoC和DI

    什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方" ...

  4. HTML5微信长按图片不会弹出菜单的解决方法

    HTML5微信长按图片不会弹出菜单的解决方法 <pre><div ontouchstart = "return false;"></div>&l ...

  5. Sitecore 8.2 数据库权限设置

    在我的一个项目中,客户决定改变基础设施.在这个过程中,我得到了一些新的东西需要学习.在本文中,我将分享有关Sitecore数据库权限的经验. 在将数据库从一个服务器移动到另一个服务器时,您需要检查提供 ...

  6. switch/case/default中的雷区

    switch的语法如下: switch(表达式){ case常量表达式1: 语句1;break; case常量表达式2: 语句2;break; - case常量表达式n: 语句n;break; def ...

  7. java中什么是接口

    一.什么是接口 接口就是一个规范,类似于硬件上面的接口,在电脑主板上的PCI插槽的规范就类似于Java接口,只要是遵循PCI接口的卡,不过是什么牌子的都可以插入到PCI插槽中.所以接口就是一个规范.接 ...

  8. springboot初体验-不知道怎么创建spring-boot项目?

    https://spring.io/projects/spring-boot/ 在以上地址找到 Quick start Bootstrap your application with Spring I ...

  9. .net core mvc启动顺序以及主要部件4-MVC

    前面三章已经把MVC启动过程以及源代码做了讲解,本章开始正式MVC,mvc全称叫model view controller,也就是把表现层又细分三层,官网的图片描述: 默认创建了一个.net core ...

  10. Phenix.NET for CSLA & WF4,企业级、分布式、符合领域建模的OOP软件快速开发平台

    2014-5-20版本: Phenix.NET for CSLA & WF 开发平台: http://download.csdn.net/download/phenixiii/7390405 ...