我们先看一个 小例子 , 使用 join 与CountDownSlatch 都可以完成 当1,2线程 完全结束后 3 线程 start 对比我们就能够知道 CountDownSlatch 比 JOIN 更能够控制粒度 因为 他只要 计数 为0 就好

  1. package com.ghc.mmall.concurrency.test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * @author :Frank Li
  6. * @date :Created in 2019/7/18 10:30
  7. * @description:${description}
  8. * @modified By:
  9. * @version: $version$
  10. */
  11. public class JoinTest {
  12. public static void main(String [] args){
  13. Thread work1Thread = new Thread(new Workder());
  14. work1Thread.setName("work1Thread");
  15. Thread work2Thread = new Thread(new Workder());
  16. work2Thread.setName("work2Thread");
  17. List<Thread> threads = new ArrayList<>();
  18. threads.add(work1Thread);
  19. threads.add(work2Thread);
  20. for(Thread thread:threads){
  21. thread.start();
  22. }
  23. for(Thread thread:threads){
  24. try {
  25. thread.join();
  26. } catch (InterruptedException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. Thread work3Thread = new Thread(new Workder());
  31. work3Thread.setName("work3Thread");
  32. work3Thread.start();
  33. // System.out.println(Thread.currentThread().getName()+" ");
  34. }
  35. }
  36. class Workder implements Runnable{
  37. @Override
  38. public void run() {
  39. try {
  40. System.out.println(Thread.currentThread().getName()+"--> 开始工作");
  41. Thread.sleep(2000);
  42. System.out.println(Thread.currentThread().getName()+"--> 第一阶段完成了");
  43. }catch(InterruptedException e){
  44. }
  45. }
  46. }
  47. output:
  48. work1Thread--> 开始工作
  49. work2Thread--> 开始工作
  50. work2Thread--> 第一阶段完成了
  51. work1Thread--> 第一阶段完成了
  52. work3Thread--> 开始工作
  53. work3Thread--> 第一阶段完成了

使用 CountDownSlatch 很显然 粒度会更小

  1. package com.ghc.mmall.concurrency.test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.CountDownLatch;
  5. /**
  6. * @author :Frank Li
  7. * @date :Created in 2019/7/18 11:30
  8. * @description:${description}
  9. * @modified By:
  10. * @version: $version$
  11. */
  12. public class CountDownSlatchTest {
  13. private static final CountDownLatch countDownLatch = new CountDownLatch(2);
  14. public static void main(String [] args){
  15. Thread worker1 = new Thread(new Worker(countDownLatch),"worker1");
  16. Thread worker2 = new Thread(new Worker(countDownLatch), "worker2");
  17. Thread worker3 = new Thread(new Worker(countDownLatch), "worker3");
  18. List<Thread> threads = new ArrayList<>(3);
  19. threads.add(worker1);
  20. threads.add(worker2);
  21. threads.add(worker3);
  22. for(Thread thread:threads){
  23. thread.start();
  24. }
  25. try {
  26. countDownLatch.await();
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. for(Thread thread:threads){
  31. try {
  32. thread.join();
  33. } catch (InterruptedException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }
  38. }
  39. class Worker implements Runnable{
  40. private CountDownLatch countDownLatch;
  41. Worker(CountDownLatch countDownLatch){
  42. this.countDownLatch = countDownLatch;
  43. }
  44. @Override
  45. public void run(){
  46. System.out.println(Thread.currentThread().getName()+"--> 开始第一阶段任务...");
  47. try{
  48. Thread.sleep(2000);
  49. countDownLatch.countDown();
  50. System.out.println(Thread.currentThread().getName()+"--> 结束第一阶段任务...");
  51. }catch (InterruptedException e){
  52. }
  53. try {
  54. Thread.sleep(3000);
  55. System.out.println(Thread.currentThread().getName()+"--> 开始第二阶段任务...");
  56. } catch (InterruptedException e) {
  57. e.printStackTrace();
  58. }
  59. System.out.println(Thread.currentThread().getName()+"--> 结束第二阶段任务...");
  60. }
  61. }
  62. output:
  63. worker1--> 开始第一阶段任务...
  64. worker2--> 开始第一阶段任务...
  65. worker3--> 开始第一阶段任务...
  66. worker1--> 结束第一阶段任务...
  67. worker2--> 结束第一阶段任务...
  68. worker3--> 结束第一阶段任务...
  69. worker1--> 开始第二阶段任务...
  70. worker1--> 结束第二阶段任务...
  71. worker2--> 开始第二阶段任务...
  72. worker2--> 结束第二阶段任务...
  73. worker3--> 开始第二阶段任务...
  74. worker3--> 结束第二阶段任务...

总结


join 与 countdownlatch 的区别 扩展 栅栏 CyclicBarrier的更多相关文章

  1. 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  2. 多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

    1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public Count ...

  3. 循环屏障CyclicBarrier以及和CountDownLatch的区别

    CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...

  4. java CyclicBarrier以及和CountDownLatch的区别

    CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的 ...

  5. Join 与 CountDownLatch 之间的区别

    Join 与 CountDownLatch 之间的区别 import java.util.concurrent.CountDownLatch; public class CountDownLatchT ...

  6. join和countDownLatch原理及区别详解

    先上结论 原理 join 原理:在当前线程中调用另一个线程线程 thread 的 join() 方法时,会调用该 thread 的 wait() 方法,直到这个 thread 执行完毕(JVM在 ru ...

  7. 闭锁CountDownLatch与栅栏CyclicBarrier

    https://blog.csdn.net/lmc_wy/article/details/7866863   闭锁CountDownLatch与栅栏CyclicBarrier     浅谈 java ...

  8. 多线程-栅栏CyclicBarrier

    上一篇总结了闭锁CountDownLatch,这一篇总结一下栅栏CyclicBarrier.它们两者之间的区别主要是,闭锁是等待一个事件发生,比如上一篇的田径比赛,运动员等待裁判哨声一响就可以开始跑, ...

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

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

随机推荐

  1. Maven报错,没有有效的生命周期

    [ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a g ...

  2. Java第09次实验(流与文件)

    第一次实验 0. 字节流与二进制文件 1.使用DataOutputStream与FileOutputStream将Student对象写入二进制文件student.data 二进制文件与文本文件的区别 ...

  3. 10、kubernetes之RBAC认证

    一.kubectl proxy # kubectl proxy --port=8080 # curl http://localhost:8080/api/v1/ # curl http://local ...

  4. echarts折线图,纵坐标数值显示不准确的问题解决

    问题如图: 问题解决:将stack去掉或注释 如下图:

  5. 通过jenkins-Python在后台操作Jenkins构建job

    最近要开发1个接口,接收到1个指令后自动触发自动化测试,虽然也可以通过shell命令做这一步,但因为目前所有构建自动化的的动作都通过jenkins完成,所以想要尝试能不能用python去控制jenki ...

  6. JavaEE-实验四 HTML与JSP基础编程

    1.使用HTML的表单以及表格标签,完成以下的注册界面(验证码不做) html代码(css写于其中) <!DOCTYPE html> <html> <head> & ...

  7. json -- fastjson如何序列化@Transient的字段

    今天把fastjson包改成了1.2.58,发现@Transient标注的字段序列化后不见了,但是项目需要把@Transient字段序列化,处理方法: 原文:https://github.com/al ...

  8. oracle 一张表插入另外一张表 存储过程

    ----创建存储过程 create or replace procedure inserttest as cursor cs is select id, name, cla, addr, phone, ...

  9. etcd单节点安装

    本篇安装单个etcd,然后进行扩容etcd节点至2个,环境配置如果做了的话就跳过 实验架构 test1: 192.168.0.91 etcd test2: 192.168.0.92 无 test3: ...

  10. python关键字参数和位置参数

    关键字参数必须跟随在位置参数后面! 因为python函数在解析参数时, 是按照顺序来的, 位置参数是必须先满足, 才能考虑其他可变参数.,否则报错如下: In [74]: print(s1.forma ...