原文地址: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. Thread.Join()方法的理解

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

  2. java thread join()_Java中Thread.join()的使用方法

    概要 本文分三个部分对thread.join()进行分析: 1. join() 的示例和作用 2. join() 源码分析 3. 对网上其他分析 join() 的文章提出疑问 1. join() 的示 ...

  3. python threading模块的方法_Python THREADING模块中的JOIN()方法深入理解

    看了oschina上的两个代码,受益匪浅.其中对join()方法不理解,看python官网文档的介绍: join([timeout]):等待直到进程结束.这将阻塞正在调用的线程,直到被调用join() ...

  4. c++11中thread join和detach的区别

    线程状态: 在一个线程的生存期内,可以在多种状态之间转换,不同的操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状态还可以包含多个子状态,但大体来说,如下几种状态是通用的: 1)就绪:参与 ...

  5. 对C#中Thread.IsBackground属性的理解

    C#中,Thread类有一个IsBackground 的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程.个人感觉这样的解释等于没有解释. .Net中的线程,可以分为后台 ...

  6. Thread.Join()用法的理解

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

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

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

  8. 关于CDO中去趋势的一点理解

    碎碎念 1.去趋势基本概念理解 维基百科给出的解释: 在随机过程, 混沌理论和时间序列分析中, 去趋势波动分析(英文:Detrended Fluctuation Analysis, DFA)是一种判断 ...

  9. 算法中对数量级的一点理解

    前言 最近开始学习算法知识,仅记录自己对算法学习感悟,同时也是方便自己以后复习 1.为什么我们需要了解数量级 我们需要去精确描述一组数据的时候,我们通常使用具体的数据记录,但是我们去理解一组数据的时候 ...

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

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

最新文章

  1. 『第27天』Sunos(二)
  2. 再见,再见,5 * 60 * 1000 //五分钟,再见,再见
  3. 2021年南宁二中高考成绩查询,2021广西高考圆满结束,6月23日可查询成绩
  4. 在循环递增一次的数组中插入元素
  5. UDT中select异常
  6. G20:奥巴马称美国拥有全球最大最好的网络武器库
  7. java 选取topn_取Oracle中实现TOPN,选取前几条记录
  8. vb语言和python语言_用VB“写”Python程序
  9. 计算机程序计算排列组合(规避溢出)
  10. 计算View中的子View在View的superview中的坐标
  11. java util什么意思_java.util中,util是什么意思
  12. MySQL权限系统(一).The MySQL Access Privilege System 概述
  13. math库和randon库
  14. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析
  15. 联想ghost重装系统_如何使用ghost手动安装系统_手动ghost安装系统图文步骤
  16. vue-element-admin 花裤衩 模板 ,中文版,运行报错解决方案
  17. java内存垃圾_Java内存区域与垃圾回收
  18. 邮件服务器邮件群发几个技巧
  19. 备考2022考研英语二小作文
  20. quickpcb添加pcb库_quickpcb2005详细步骤教程

热门文章

  1. java 数学基础_Java中的基础数学
  2. python2最新版本_Python 2.7.18发布,Python 2的最新版本
  3. OFFICE技术讲座:一级标点压缩共有几种情形
  4. Xcode 11.7(12.4)/13.2的signing和sandbox配置截图对比
  5. 韩国李世石跟韩国AI大战,2负一胜
  6. fenking是什么意思?
  7. CPU又烧了,说起来汝可能不信
  8. RGB数据剪切后保存为JPG格式文件的代码(使用jpeglib)
  9. 如何判断NSMutableDictionary是否有某个key
  10. is not in the sudoers files的解决办法