文档章节

如何实现主线程需要等待子线程的结果,然后才能往下执行。

KeepMoving
 KeepMoving
发布于 2015/08/25 15:48
字数 434
阅读 45
收藏 0

如何实现主线程需要等待子线程的结果,然后才能往下执行。

1.      使用FLAG标志位

[java] view plaincopy

  1. public class TestSync {  

  2.   

  3.     private static int FLAG = 0;  

  4.   

  5.     public static void main(String[] args) {  

  6.   

  7.         Thread1 thread1 = new Thread1();  

  8.         System.out.println("thread 1 is start");  

  9.         thread1.start();  

  10.           

  11.         while (FLAG != 1) {  

  12. //          System.out.println("main thread is waiting");  

  13.         }  

  14.           

  15.         FLAG = 0;  

  16.         System.out.println("main thread is back to work");  

  17.           

  18.           

  19.     }  

  20.   

  21.     static class Thread1 extends Thread {  

  22.   

  23.         int total;  

  24.   

  25.         public void run() {  

  26.   

  27.             System.out.println("thread 1 is running");  

  28.   

  29.             for (int i = 0; i < 5; i++) {  

  30.                 total = total + i;  

  31.   

  32.                 System.out.println("total = " + total);  

  33.             }  

  34.   

  35.             System.out.println("thread 1 is over and set flag to 1");  

  36.             FLAG = 1;  

  37.   

  38.         }  

  39.     }  

  40.   

  41.   

  42. }  


PS: 在这个期间,做一些跟thread1不相关的事情 还是可以的哦

[java] view plaincopy

  1. while (FLAG != 1) {  

  2. //          System.out.println("main thread is waiting");  

  3.         }  


[java] view plaincopy

  1.   

输出结果:

2.join(),理解成等待子线程终止,可用于等待一个或多个子线程的结果,然后主线程再继续执行。

[java] view plaincopy

  1. public class TestSync {  

  2.   

  3.       

  4.   

  5.     public static void main(String[] args) throws InterruptedException {  

  6.   

  7.         for(int i = 0; i<5 ;i++){  

  8.         Thread1 thread1 = new Thread1();  

  9.         System.out.println("thread " + i +"  is start");  

  10.         thread1.start();  

  11.         thread1.join();  

  12.         }  

  13.           

  14.         System.out.println("main thread is back to work");  

  15.           

  16.     }  

  17.   

  18.     static class Thread1 extends Thread {  

  19.   

  20.   

  21.         public void run() {  

  22.   

  23.             System.out.println("thread  is running");  

  24.   

  25.         }  

  26.     }  

  27.   

  28.       

  29. }  


输出结果:



3. CountDownLatch 这个原理应该是通过检查子线程的个数来实现的


[java] view plaincopy

  1. import java.util.concurrent.CountDownLatch;  

  2.   

  3. public class TestSync {  

  4.   

  5.     private static CountDownLatch countdownLatch = new CountDownLatch(5);  

  6.       

  7.     public static void main(String[] args) throws InterruptedException {  

  8.   

  9.       

  10.   

  11.         for (int i = 0; i < 5; i++) {  

  12.             Thread1 thread1 = new Thread1();  

  13.             System.out.println("thread " + i + "  is start");  

  14.             thread1.start();  

  15.         }  

  16.   

  17.         //用于等待  

  18.         countdownLatch.await();  

  19.   

  20.         System.out.println("main thread is back to work");  

  21.   

  22.           

  23.     }  

  24.   

  25.     static class Thread1 extends Thread {  

  26.   

  27.         public void run() {  

  28.             System.out.println("thread  is running");  

  29.             //执行完一个用于减少子线程计数的  

  30.             countdownLatch.countDown();  

  31.         }  

  32.     }  

  33.   

  34. }  


输出结果:



PS: 通过输出结果发现,join()的话,貌似子线程们是串行执行的啊。。。会影响效率的吧。。。


本文转载自:http://blog.csdn.net/null1989/article/details/11972881

KeepMoving
粉丝 13
博文 22
码字总数 4145
作品 0
厦门
高级程序员
私信 提问
Java进阶知识 - 线程间通信

, 分别适合什么场景呢? 大部分情况下, 子线程只需要关心自身执行的任务. 但在某些复杂的情况下, 需要使用多个线程来协同完成某个任务, 这就涉及到线程间通信(inter-thread communication)的问...

铁锚
03/12
0
0
Java并发编程原理与实战六:主线程等待子线程解决方案

本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { } 首先是一个线程,它执行完成需要5秒。 1、主线程等待一个子线程 pu...

pony1223
2018/07/23
0
0
Java并发编程之CountDownLatch

CountDownLatch(闭锁)是一个很有用的工具类,利用它我们可以拦截一个或多个线程使其在某个条件成熟后再执行。 说到这,给大家举一个最典型的例子:假设一条流水线上有三个工作者:worker0,w...

code_xzh
2018/05/24
0
0
Java 如何实现线程间通信?

正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。 本文涉及到的知识点: thread.join(), object....

颖辉小居
2018/12/14
21
2
Qt多线程学习(一)——继承QThread

目录 前言 通过继承的函数来实现。 学习!分享!感谢! 多线程 多线程的优点 提高应用程序的响应速度。对开发图形界面程序尤为重要,当一个操作耗时很长时,整个系统都会等待这个操作,程序就...

simonforfuture
2017/12/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部