C#多线程JOIN方法初探

[说明:刚接触多线程时,弄不明白Join()的作用,查阅了三本书,都不明不白。后来经过自己的一番试验,终于弄清了Join()的本质。大家看看我这种写法是否易懂,是否真的写出了Join()的本质,多提宝贵意见。]

  Thread类的Join()方法能够将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,线程A将插入线程B之前,直到线程A执行完毕后,才会继续执行线程B。

  试一试:线程的插入

  //《C#初学课堂》
    //注意添加命名空间
    using System.Threading;
  
    static void Main(string[] args)
    {
      //线程A
      Thread ThreadA = new Thread(delegate()
      {
        for (int i = 0; i <= 100000000; i++)
        {
          if (i % 1000000 == 0)
          {
            Console.Write('A');
          }
        }
      });
  
      //线程B
      Thread ThreadB = new Thread(delegate()
      {       
        for (int i = 0; i <= 50000000; i++)
        {
          if (i % 1000000 == 0)
          {
            Console.Write('B');
          }
        }
  
        //在这里插入线程A
        ThreadA.Join();
  
        for (int i = 0; i <= 50000000; i++)
        {
          if (i % 1000000 == 0)
          {
            Console.Write('b');
          }
        }
      });
  
      //启动线程
      ThreadA.Start();
      ThreadB.Start();
    }

  运行结果如下,你能分析清楚为什么吗?

2010021508022931.jpg

由运行结果可以看出,一开始两个线程交替进行,当线程B执行到语句“ThreadA.Join()”时,线程A被插入到线程B之前,两个线程合并到一起,变为顺序执行,直到执行完线程A中的所有语句,才去执行线程B中剩余的语句。

  换句话说,当我们在线程B中调用ThreadA.Join()时,该方法只有在线程ThreadA执行完毕之后才会返回。Join()函数还可以接受一个表示毫秒数的参数,当达到指定时间后,如果线程A还没运行完毕,那么Join函数将返回,这时线程A和线程B再次处于交替运行状态中。

http://www.cnblogs.com/millen/archive/2009/09/07/1520353.html

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F0单片机快速入门八 聊聊 Coolie DMA

1.苦力 DMA世上本没有路&#xff0c;走的人多了&#xff0c;便成了路。世上本没有 DMA&#xff0c;需要搬运的数据多了&#xff0c;便有了 DMA。大多数同学应该没有在项目中用过这个东西&#xff0c;因为一般情况下也真不需要这个东西。在早期的单片机中也不存在DMA模块。再加上…

Python3——网络编程基础

Python3——网络编程基础 基础知识参考&#xff1a; https://blog.csdn.net/wqx521/article/details/51037048 https://blog.csdn.net/wqx521/article/details/51056649 https://blog.csdn.net/wqx521/article/details/51056713 https://blog.csdn.net/wqx521/article/deta…

Python学习之==第三方模块的安装、模块导入

一、模块&包 1、模块 模块实质上就是一个Python文件&#xff0c;它是用来组织代码的。意思就是把Python代码写在里面&#xff0c;文件名就是模块的名称。例如&#xff1a;random.py&#xff0c;random就是模块的名称。 2、包 包又叫pageage&#xff0c;本质就是一个文件夹&…

【注册机】Zillions of Games v2.0.1p 注册机

下载地址&#xff1a;http://keygens.nl/crack/87061/转载于:https://www.cnblogs.com/boringlamb/archive/2010/02/24/1672404.html

操作系统中抢占式和非抢占式内核的区别

编排 | strongerHuang微信公众号 | 嵌入式专栏操作系统分为抢占式内核和非抢占式内核&#xff0c;通常RTOS都是抢占式内核。下面就来讲讲抢占式内核和非抢占式内核的内容。非抢占式内核非抢占式内核要求每个任务&#xff08;线程&#xff09;都做一些事情来明确放弃对 CPU 的控…

Python3——简单的TCP实例

Python3网络编程——简单的TCP实例 服务器&#xff1a;创建套接字——绑定服务器地址——监听连接——接受连接——数据接收/发送 客户端&#xff1a;创建套接字——连接服务器地址——数据接收/发送 """ server.py encode()/decode() """ fro…

位图索引,数据库索引浅浅的学习

摘自http://www.cnblogs.com/LBSer/p/3322630.html 位图&#xff08;BitMap&#xff09;索引 前段时间听同事分享&#xff0c;偶尔讲起Oracle数据库的位图索引&#xff0c;顿时大感兴趣。说来惭愧&#xff0c;在这之前对位图索引一无所知&#xff0c;因此趁此机会写篇博文介绍下…

UDP协议 sendto 和 recvfrom 浅析与示例

图片/在思考的樱木花道UDP&#xff08;user datagram protocol&#xff09;用户数据报协议&#xff0c;属于传输层。UDP是面向非连接的协议&#xff0c;它不与对方建立连接&#xff0c;而是直接把数据报发给对方。UDP无需建立类如三次握手的连接&#xff0c;使得通信效率很高。…

2010软考软件设计师冲刺精选【专家压轴模拟•下】

2010软考软件设计师冲刺精选【专家压轴模拟•下】 自测简介&#xff1a; 为迎战2010年软考&#xff0c;51CTO特邀请软考专家为网友出了一系列模拟冲刺题。其中包括网络规划设计师、网络工程师、网络管理员、软件设计师、程序员等。本套技术自测是软考软件设计师冲刺模拟题…

劝你要看一些有门槛的机会

最近发了很多招聘信息&#xff0c;招聘的岗位算不错的&#xff0c;但是投简历的人不多。我想起来刚开始工作那几年&#xff0c;工资虽然很低&#xff0c;但是也不怎么想鞠躬投简历&#xff0c;毕竟那个时候把面子这个事情看的比什么都重要。自己觉得自己有才&#xff0c;不过后…

Python3——简单的UDP实例

Python3——简单的UDP实例 服务器&#xff1a;创建套接字——绑定套接字——数据接收/发送 客户端&#xff1a;创建套接字——数据接收/发送 """ server.py encode()/decode() """ from socket import * from time import ctimeHOST PORT 11…

[状压dp]洛谷 P2157 学校食堂

题目描述 小F 的学校在城市的一个偏僻角落&#xff0c;所有学生都只好在学校吃饭。学校有一个食堂&#xff0c;虽然简陋&#xff0c;但食堂大厨总能做出让同学们满意的菜肴。当然&#xff0c;不同的人口味也不一定相同&#xff0c;但每个人的口味都可以用一个非负整数表示。 由…

怎么得到自增列的下一个会插入的id

代码 1declareTable_namevarchar(60) 2setTable_namePay_inputpay; 3Selectso.name Table_name, --表名字4sc.name Iden_Column_name, --自增字段名字5ident_current(so.name) curr_value, --自增字段当前值6ident_incr(so.name) incr_value,…

ESP32,使用gitee搭建 ESP-IDF 开发框架

ESP32便宜&#xff0c;开发方便&#xff0c;非常适合初学者用来学习&#xff0c;之前我自己写的开发环境可能不再适合&#xff0c;推荐下面这篇文章。关于如何搭建ESP32的开发环境&#xff0c;乐鑫官方给出了很详细的教程和文档&#xff0c;基本上跟着官方教程来操作&#xff0…

jQuery的ajax技术

编辑本博客 ajax异步的JavaScript和html load() 从服务器加载数据&#xff0c;并把返回的数据放入备选元素中。这里加载回来的数据可以只有一个p标签&#xff0c;无需head元素等 $("selector").load(url,data,callback) url&#xff1a;必选&#xff0c;规定加载的ur…

Python3——FTP(文件传输协议)

Python3——FTP&#xff08;文件传输协议&#xff09; 工作流程&#xff1a; 客户端连接远程主机的FTP服务器&#xff1b;客户端输入用户名密码&#xff1b;客户端进行各种文件传输和信息查询&#xff1b;客户端从FTP服务器退出。ftplib.FTP常用方法 login(user,passwd)登录 …

Linux设备树的传递以及kernel中对设备树的解析

当U-Boot将设备树加载到内存指定位置后&#xff0c;ARM内核的SoC以通用寄存器r2来传递dtb在内存中的地址。kernel获取到该地址后对dtb文件做进一步的处理。#设备树的传递当使用bootm加载kernel镜像时&#xff08;bootz是对bootm的一种封装以及功能扩展&#xff0c;实质一样&…

切片基础slice

定义&#xff1a;slice表示一个拥有相同类型元素的可变长度的序列 slice有三个属性&#xff1a;指针&#xff0c;长度&#xff0c;容量 指针指向第一个可以从slice中访问的元素&#xff0c;这个元素并不一定是数组的第一个元素 注意&#xff1a; 1.一个底层数组可以对应多个sli…

常用shell命令

要复制整个目录&#xff0c;请使用 cp 命令的 -r 选项。例如&#xff0c;如果有一个名为 mydir 的目录&#xff0c;其中包含 myfile 和 newfile&#xff0c;则可以将该目录复制到一个名为 mydir2 的新目录。mydir2 还将包含 myfile 和 newfile 的副本。请使用以下命令&#xff…

Linux kernel之SMP初始化

01—SMP数据结构SMP的数据结构如下图所示&#xff0c;主要由2部分构成&#xff0c;通过两个宏定义CONFIG_SMP和CONFIG_HOT_PLUG来控制。当设置kernel支持SMP模式时&#xff0c;那么CONFIG_SMP选项是一定会打开的&#xff0c;因此第一部分是必须实现的内容。而第二部分是否需要实…