如题 (总结要点 ,看不懂下面有更多解释, 参考书籍《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. 软件工程1916|W(福州大学)_助教博客】个人总结作业(第12次)成绩公示

    1.作业链接 个人作业--软件工程实践总结作业 https://edu.cnblogs.com/campus/fzu/SoftwareEngineering1916W/homework/3316 2. ...

  2. Maven 教程(20)— 使用maven-assembly-plugin插件来定制化打包

    原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79777976 简单的说,maven-assembly-plugin 就是用来帮助 ...

  3. win10 .net framework 3.5 离线安装 不需要外网

    win 10如果安装系统时没有安装.net 3.5 那么在以后安装时就必须联网. win10 .net framework 3.5 离线安装工具: 链接: https://pan.baidu.com/ ...

  4. SQL Server ----- 生成sql 脚本

    通过生成sql 脚本进行数据库转移 选中需要进行转移的数据库 点击生成脚本后出现 进入的是简介界面    直接点击下一步 进入到选择对象界面. 按照步骤进行设置     选择你需要的    架构和数据 ...

  5. Lua table的remove函数

    [1]remove函数简介 table.remove(table, pos): 返回table数组中位于pos位置的元素,其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元 ...

  6. Luogu - P1018 乘积最大 - 题解

    原文:https://www.luogu.org/problemnew/solution/P1018?page=7 题目:P1018[乘积最大] 前言: 这题的正解理论上说是DP,可是由于民间数据太水 ...

  7. Java学习:数据结构简介

    数据结构 数据结构: 数据结构_栈:先进后出 入口和出口在同一侧 数据结构_队列:先进先出 入口和出口在集合的两侧 数据结构_数组: 查询快:数组的地址是连续的,我们通过数组的首地址可以找到数组,通过 ...

  8. java中反射知识点总结

      1 package Demo; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 impo ...

  9. HTML 引用大全

    路径logo <link rel="icon" href="../framework7-4.4.10/kitchen-sink/core/img/ztjs.png& ...

  10. python 中 try,except,finally 的执行顺序

    写代码的时候发现了好玩的事情,常常作为终止的 return 语句并不总是能够立刻跳出函数 def A(): try: for i in range(10): if i == 5: return pri ...