原文地址: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

执行完毕才继续执行。

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

Peter Yao:在传统的exe或者控制台程序,我们的测试代码往往会为了测试而编写这种体制的代码,但是楼主只是自己明白了,这种解释对园子中的人是一种片面误导,首先我们在一段程序中不可能去跑一个线程,Main入口就启动至少一个线程,那么我们的其他线程如果在此主线程下调用,则会阻塞此当前主线程,下面的子线程们并不会被阻塞,就好比跑道中的人群争相抢资源而已。。。很多人会误解楼主的这种说法。。。呵呵。。

支持,线程的目的就是能多线操作,主线程运行的同时子线程也执行,

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "MainThread";
 
            Thread newThread = new Thread(new ThreadStart(ThreadFuncOne));
            newThread.Name = "NewThread";
 
            newThread.Start();
            for (int j = 0; j < 100; j++)
            {
                //if (j == 30)
                //{
                //    newThread.Start();
                //    newThread.Join();
                //}
                //else
                //{
                    Console.WriteLine(Thread.CurrentThread.Name + "   j =  " + j);
                //}
            }
            Console.Read();
 
        }
        private static void ThreadFuncOne()
        {
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "   i =  " + i);
            }
            Console.WriteLine(Thread.CurrentThread.Name + " has finished");
        }
    }
}

这样或许会对初学者好理解点,先运行一次上面的代码,是主线程和子线程一起运行的效果把数字改大。
然后把所有注释取消,把主函数for循环上的newThread.Start();
注释掉,就可以看到join明显的用处了

关于C#中Thread.Join()的一点理解的更多相关文章

  1. C#中Thread.Join()的理解

    最近在项目中使用多线程,但是对多线程的一些用法和概念还有有些模棱两可,为了搞清楚查阅了一写资料,写下这篇日志加深理解吧. Thread.Join()在MSDN中的解释很模糊:Blocks the ca ...

  2. 多线程编程(一) - 关于C#中Thread.Join()

    Thread.Join()在MSDN中的解释很模糊:Blocks the calling thread until a thread terminates 有两个主要问题:1.什么是the calli ...

  3. 关于css中层叠性的一点理解

    关于css层叠性的一点理解 标签(空格分隔): html css 我们平时在写css的时候会遇到这样的情况 <!DOCTYPE html> <html lang="en&q ...

  4. C# Thread.Join()用法的理解 转

    指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行 比如 1using System; 2 3namespace TestThreadJoin 4{ 5 class P ...

  5. 关于bottle WEB框架中签名cookie的一点理解

    首先要理解一个概念 MAC (message authenticate code) 消息认证码(带密钥的Hash函数):密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具. 构造方 ...

  6. 对ContentProvider中getType方法的一点理解

    在上篇博客中我们介绍了自定义ContentProvider,但是遗漏掉了一个方法,那就是getType,自定义ContentProvider一般用不上getType方法,但我们还是一起来探究下这个方法 ...

  7. 对java中classloader使用的一点理解(转)

    先简单介绍下java的classloader,网上资料很多,就说点关键的. Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的.系统提供的类加载器主 ...

  8. CCSpriteBatchNode中存放元素的一点理解

    该对象只能包含基于CCSprite的对象,并且该要求适用于一切子孙对象.即加入CCSpriteBatchNode的任何对象都必须是CCSprite或其子类. 比如CCSpriteBatchNode包含 ...

  9. vue中关于computed的一点理解

    computed相当于属性的一个实时计算,如果实时计算里关联了对象,那么当对象的某个值改变的时候,同事会出发实时计算. 例子: <body id="content"> ...

随机推荐

  1. [转] Java中的访问控制

    可见/访问性 在同一类中 同一包中 不同包中  同一包子类中  不同包子类中   public  yes  yes  yes  yes  yes  protected   yes  yes  no   ...

  2. JAVA IDE基本操作常识

    快捷键: Ctrl+/   选中区单行注释和 取消 选中区单行注释和 Alt + / 代码辅助 shift + Ctrl +/ 选中区多行注释 shift + Ctrl +\ 取消选中区多行注释 Ct ...

  3. 使用APICloud设计物联网APP

    0.前言 1).APP功能: 1.控制室内插座的开关. 2.查看室内实时温湿度和温湿度趋势. 3.控制小车的行走,小车摄像头的开启/关闭.移动. 4.查看摄像头监控画面,可拍照并追溯. 5.查看服务器 ...

  4. Handler导致内存泄露分析

    (非静态)内部类引起内存泄漏的原因         内部类的实现其实是通过编译器的语法糖(Syntactic sugar)实现的,通过生成相应的子类即以OutClassName$InteriorCla ...

  5. HDU5317

    题意:定义一个数K,最小质因数形式为K = a*b*c形式(如12 = 2*2*3),相同只取一个(所以12只能取2,3两个,既F[12]=2)给L,R区间,找出区间内最大的F[x](L<=x& ...

  6. HTML5 离线缓存忽略主页实例

    默认情况下 指定html mianfest的当前页面会自动离线缓存到客户端. 取消的方法,可以使用iframe类实现 1.主页定义: <iframe frameborder="no&q ...

  7. Swift - 25 - 控制转移和二维数组

    //: Playground - noun: a place where people can play import UIKit // fallthrough // fallthrough会在当前c ...

  8. Java study 1:The note of studying Socket which based UDP

    UDP concept: UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参 ...

  9. js删除数组指定的某个元素

    1.给js数组对象原型加indexof方法 获得元素索引 Array.prototype.indexOf = function(val) { for (var i = 0; i < this.l ...

  10. 解决 asp.net 伪静态 IIS设置后 直正HTML无法显示的问题

    asp.net+UrlRewriter来实现网站伪静态,实现伪静态有一些好处,比如对于搜索引擎更好收录页面,还有一个好处就是隐藏了真实地址的参数,所以有独立服务器的朋友,配置IIS实现伪静态功能,挺不 ...