本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明:

1、使用Thread的join()方法,join()方法会阻塞主线程继续向下执行。

2、使用Java.util.concurrent中的CountDownLatch,是一个倒数计数器。初始化时先设置一个倒数计数初始值,每调用一次countDown()方法,倒数值减一,他的await()方法会阻塞当前进程,直到倒数至0。

join方式代码如下:

  1. package com.test.thread;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class MyThread extends Thread
  5. {
  6. public MyThread(String name)
  7. {
  8. this.setName(name);
  9. }
  10. @Override
  11. public void run()
  12. {
  13. System.out.println(this.getName() + " staring...");
  14. System.out.println(this.getName() + " end...");
  15. }
  16. /**
  17. * @param args
  18. */
  19. public static void main(String[] args)
  20. {
  21. System.out.println("main thread starting...");
  22. List<MyThread> list = new ArrayList<MyThread>();
  23. for (int i = 1; i <= 5; i++)
  24. {
  25. MyThread my = new MyThread("Thrad " + i);
  26. my.start();
  27. list.add(my);
  28. }
  29. try
  30. {
  31. for (MyThread my : list)
  32. {
  33. my.join();
  34. }
  35. }
  36. catch (InterruptedException e)
  37. {
  38. e.printStackTrace();
  39. }
  40. System.out.println("main thread end...");
  41. }
  42. }

运行结果如下:

main thread starting...
Thrad 2 staring...
Thrad 2 end...
Thrad 4 staring...
Thrad 4 end...
Thrad 1 staring...
Thrad 1 end...
Thrad 3 staring...
Thrad 3 end...
Thrad 5 staring...
Thrad 5 end...
main thread end...
CountDownLatch方式代码如下:

  1. package com.test.thread;
  2. import java.util.concurrent.CountDownLatch;
  3. public class MyThread2 extends Thread
  4. {
  5. private CountDownLatch count;
  6. public MyThread2(CountDownLatch count, String name)
  7. {
  8. this.count = count;
  9. this.setName(name);
  10. }
  11. @Override
  12. public void run()
  13. {
  14. System.out.println(this.getName() + " staring...");
  15. System.out.println(this.getName() + " end...");
  16. this.count.countDown();
  17. }
  18. /**
  19. * @param args
  20. */
  21. public static void main(String[] args)
  22. {
  23. System.out.println("main thread starting...");
  24. CountDownLatch count = new CountDownLatch(5);
  25. for (int i = 1; i <= 5; i++)
  26. {
  27. MyThread2 my = new MyThread2(count, "Thread " + i);
  28. my.start();
  29. }
  30. try
  31. {
  32. count.await();
  33. }
  34. catch (InterruptedException e)
  35. {
  36. e.printStackTrace();
  37. }
  38. System.out.println("main thread end...");
  39. }
  40. }

运行结果如下:

main thread starting...
Thread 2 staring...
Thread 2 end...
Thread 4 staring...
Thread 4 end...
Thread 1 staring...
Thread 1 end...
Thread 3 staring...
Thread 3 end...
Thread 5 staring...
Thread 5 end...
main thread end...

Java实现主线程等待子线程的更多相关文章

  1. JAVA进阶----主线程等待子线程各种方案比较(转)

    创建线程以及管理线程池基本理解 参考原文链接:http://www.oschina.net/question/12_11255?sort=time 一.创建一个简单的java线程 在 Java 语言中 ...

  2. java多线程实现主线程等待子线程执行完问题

    本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...

  3. Java多线程之以7种方式让主线程等待子线程结束

    记一次主线程等待子线程结束的多种方法的学习 在学习多线程时,最开始遇到的问题其实是"计算子线程运行时间",写到最后发现本文和标题更为符合,但是仍然基于问题:"在主线程中获 ...

  4. C#主线程等待子线程运行结束

    佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然 ...

  5. Java主线程等待子线程、线程池

    public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...

  6. Java并发编程原理与实战六:主线程等待子线程解决方案

    本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { Sys ...

  7. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  8. Java线程池主线程等待子线程执行完成

    今天讨论一个入门级的话题, 不然没东西更新对不起空间和域名~~ 工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一 ...

  9. Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束

    Java 5 开始引入的 Concurrent 并发软件包里面的 CountDownLatch 其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是 ...

随机推荐

  1. Cookie简单实例

    Cookie简单实例 1.创建CookieServlet package com.servlet.study; import java.io.IOException; import java.io.P ...

  2. String.format()格式化日期(2)

    在以前的开发中,日期格式化一直使用的是SimpleDateFormat进行格式化.今天发现String.format也可以格式化.当 然,两种方式的优劣没有进行深入分析. 1. 日期格式化 (2018 ...

  3. vs中无法找到头文件

    在VS项目上右键属性 C/C++->常规->附加包含目录中把此路径添加上,路径与路径之间用 ; 隔开

  4. istio 安装试用

    1. 命令行工具 curl -L https://git.io/getIstio | sh - 2. 环境变量配置 export PATH=$PWD/bin:$PATH 3. RBAC 检验 kube ...

  5. filter防盗链

    1这次练习中一直受到相对路径的干扰,现在澄清一点 forward中不是不需要包含根目录的  比如 http://localhost:8080/filter/upload/images/no.jpg 你 ...

  6. jeecg中树形显示的用法

    1.GoodsController中显示的方法如下: @RequestMapping(params = "goodsgrid") @ResponseBody public Obje ...

  7. Spring链接汇总

    Spring Boot专题 基础入门内容 SpringBoot快速入门 Why Spring Boot 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cl ...

  8. Kossel的一种滑块位置计算方法

    做了一个小激光雕刻机之后,研究了一下这款3D打印机的结构和工作原理,一下就对这个运动过程很感兴趣,这三个杆是怎么联动使得喷头保持在一个平面上运动呢?打算先做一个架构,然后把激光器放在上面不是可以方便雕 ...

  9. Bitcoin 涉及到的数据结构和算法分析

    Bitcoin 2008 年中本聪提出 Bitcoin 的概念. 2009 年项目上线. 所有 coin 由 mining 产生,一共 2100 万枚.通过调整 difficulty, 确保每隔10m ...

  10. TMS320C6657双核DSP的图像处理系统开发(1):硬件相关tips

             1.前言 新项目中打算对现有的TMS320C6455+Kintex7 FPGA平台进行升级,采用TMS320C6657作为新核心,主要考虑到几点点: 1)具备DDR3接口,可以更加方 ...