当前位置: 首页 > news >正文

关于C#中Thread.Join()的一点理解

转载网址:http://www.cnblogs.com/slikyn/articles/1525940.html

 

今天是第一次在C#中接触Thread,自己研究了一下其中Thread.Join()这个方法,下面谈谈自己的理解。

 

      Thread.Join()在MSDN中的解释很模糊:Blocks the calling thread until a thread terminates

有两个主要问题:1.什么是the calling thread?

                       2.什么是a thread?

       首先来看一下有关的概念: 我们执行一个.exe文件实际上就是开启了一个进程,同时开启了至少一个线程,

但是真正干活的是线程,就好比一个Team有好几个人,但是真正干活的是人不是Team.

      具体到代码来说,以Console Application为例:程序Test.exe从Main函数开始运行,实际上是有一个线程

在执行Main函数,我们称作MainThread.假如我们在Main函数中声明了一个Thread,称作NewThread,并且调用了

NewThread.Start()的方法,那么 MainThread在处理Main函数里面的代码时遇到NewThread.Start()时,就会

去调用NewThread.

       基于上面的讨论,我们可以得出结论:在我们刚才的例子中the calling thread就是MainThread,而a thread

指的洽洽就是MainThread调用的NewThread线程。

       现在回到MSDN的解释,我们可以这么翻译:当NewThread调用Join方法的时候,MainThread就被停止执行,

直到NewThread线程执行完毕这样就好理解了吧O(∩_∩)O哈哈~

       好了,前面分析完了,现在来看测试用例吧:

Titleusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Test
{
    class TestThread
    {
        private static void ThreadFuncOne()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(Thread.CurrentThread.Name +"   i =  " + i);
            }
            Console.WriteLine(Thread.CurrentThread.Name + " has finished");
        }

        static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "MainThread";

            Thread newThread = new Thread(new ThreadStart(TestThread.ThreadFuncOne));
            newThread.Name = "NewThread";

            for (int j = 0; j < 20; j++)
            {
                if (j == 10)
                {
                    newThread.Start();
                    newThread.Join();
                }
                else
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "   j =  " + j);
                }
            }
            Console.Read();
        }
    }
}


 

下面是测试的结果:

 

 

结论:从测试中我们可以很清楚的看到MainThread在NewThread.Join被调用后被阻塞,直到NewThread

        执行完毕才继续执行。

 

转载于:https://www.cnblogs.com/ustc11wj/archive/2011/07/12/2610895.html

相关文章:

  • VMware中Linux分辨率设置问题
  • RTEMS网络内部的同步
  • 如何才能做到网站高并发访问?
  • drbd+mysql+keepalived实现高可用测试
  • 【引用】eclipse:Cannot create a server using the selected type(转)
  • CCIE RS知识点
  • 【自学考试】2006年4月15日以前的个人日记
  • vbs 技巧6则
  • WordPress 2.6 翻译基本完成,请您纠错
  • Subversion+TortoiseSVN 版本控制
  • 使用 UNIX 的 10 个良好习惯
  • vmstat参数说明
  • KDE致力于发展Wayland和Frameworks 5.0
  • about jni
  • poj1978
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • css布局,左右固定中间自适应实现
  • LeetCode18.四数之和 JavaScript
  • mac修复ab及siege安装
  • nginx 负载服务器优化
  • Redis在Web项目中的应用与实践
  • TypeScript迭代器
  • 浮现式设计
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 微服务入门【系列视频课程】
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 用Python写一份独特的元宵节祝福
  • 在weex里面使用chart图表
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • #if 1...#endif
  • (2)Java 简介
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)鸿鹄云架构一服务注册中心
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net2005怎么读string形的xml,不是xml文件。
  • /etc/shadow字段详解
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @Documented注解的作用
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [20170705]diff比较执行结果的内容.txt
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BZOJ 3282] Tree 【LCT】
  • [ES-5.6.12] x-pack ssl