热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多线程中的join()

Join,单词本事就是连接的意思。先贴出几段代码猜猜结果。publicstaticintMain(){AlphaoAlphanewAlpha();ThreadT
Join,单词本事就是连接的意思。
先贴出几段代码猜猜结果。

 <1>       

public static int Main(){ Alpha oAlpha &#61; new Alpha();Thread Thread1 &#61; new Thread(delegate() {Console.WriteLine("A"); });Thread1.Start(); Console.WriteLine("a");return 0;}




结果是先打印 A 还先打印 a &#xff1f;

  <2>     

public static int Main(){ Alpha oAlpha &#61; new Alpha();Thread Thread1 &#61; new Thread(delegate() {Console.WriteLine("A"); });Thread1.Start(); Thread1.Join();//注意这里Console.WriteLine("a");return 0;}




结果是先打印 A 还先打印 a &#xff1f;
------------------------------------------------------
<3>

static void Main(string[] args){//线程AThread ThreadA &#61; new Thread(delegate(){for (int i &#61; 0; i <10; i&#43;&#43;){Console.WriteLine("A : " );if (i &#61;&#61; 9){break;}Thread.Sleep(1000);}});//线程BThread ThreadB &#61; new Thread(delegate(){for (int i &#61; 0; i <5; i&#43;&#43;){Console.WriteLine("B : ");if (i &#61;&#61; 4){break;}Thread.Sleep(1000);}ThreadA.Join();//在这里插入线程Afor (int i &#61; 0; i <5; i&#43;&#43;){Console.WriteLine("C : " );if (i &#61;&#61; 4){break;}Thread.Sleep(1000);}});ThreadA.Start();ThreadB.Start();}




<4>

public static int Main(){Thread.CurrentThread.Join();Console.WriteLine("O(∩_∩)O哈哈");return 0;}




----------------------------------------------------

thread.Join把指定的线程加入到当前线程&#xff0c;可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法&#xff0c;直到线程A执行完毕后&#xff0c;才会继续执行线程B。
t.join();      //使调用线程 t 在此之前执行完毕。
t.join(1000);  //等待 t 线程&#xff0c;等待时间是1000毫秒

运行结果&#xff1a;


1 A 和 a不分先后&#xff0c;Thread1线程很简单启动耗时非常小&#xff0c;Thread1线程和主线程几乎是同步的&#xff0c;所以打印A a不分前后根据CPU当时运行环境决定。

2 先打印A 再打印 a &#xff0c;因为Thread1执行了Join()&#xff0c;相当于在主线程中添加了Thread1线程&#xff0c;就是说只有当Thread1执行结束之后主线程才能继续执行。

换句话说在主线程中嵌了一段代码&#xff0c;只有这段代码执行结束&#xff08;这里不要以为调用了Join()线程Thread1会从头开始执行&#xff0c;不明白这句话可以运行下第3端程序&#xff09;&#xff0c;

主线程才可以继续执行后面的代码。


3 前5秒 A B交替出现&#xff0c;然后A出现5次&#xff0c;C出现5次。
如果注释掉ThreadA.Join()&#xff0c;那么结果是前5秒AB 交替出现 后5秒AC交替出现。
这里我就不再罗嗦了。还是那样线程B中join了线程A只有A执行结束&#xff0c;才可以继续执行线程B中剩下的代码。
join其实就是使异步执行线程转为同步执行。

4 主线程被终止

main线程等待main线程结束&#xff0c;而main本身未结束&#xff0c;所以这就形成一个圈子&#xff0c;变相地实现了main.sleep(无限)的功能。。。


推荐阅读
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
-像我这样笨拙的生活_992_559
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有