关于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
执行完毕才继续执行。
------------------------------------------------------------------------
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()的一点理解相关推荐
- Thread.Join()方法的理解
关于C#中Thread.Join()的一点理解 今天是第一次在C#中接触Thread,自己研究了一下其中Thread.Join()这个方法,下面谈谈自己的理解. Thread.Join()在MSDN中 ...
- java thread join()_Java中Thread.join()的使用方法
概要 本文分三个部分对thread.join()进行分析: 1. join() 的示例和作用 2. join() 源码分析 3. 对网上其他分析 join() 的文章提出疑问 1. join() 的示 ...
- python threading模块的方法_Python THREADING模块中的JOIN()方法深入理解
看了oschina上的两个代码,受益匪浅.其中对join()方法不理解,看python官网文档的介绍: join([timeout]):等待直到进程结束.这将阻塞正在调用的线程,直到被调用join() ...
- c++11中thread join和detach的区别
线程状态: 在一个线程的生存期内,可以在多种状态之间转换,不同的操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状态还可以包含多个子状态,但大体来说,如下几种状态是通用的: 1)就绪:参与 ...
- 对C#中Thread.IsBackground属性的理解
C#中,Thread类有一个IsBackground 的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程.个人感觉这样的解释等于没有解释. .Net中的线程,可以分为后台 ...
- Thread.Join()用法的理解
指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行 比如 1using System; 2 3namespace TestThreadJoin 4{ ...
- 关于bottle WEB框架中签名cookie的一点理解
首先要理解一个概念 MAC (message authenticate code) 消息认证码(带密钥的Hash函数):密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具. 构造方 ...
- 关于CDO中去趋势的一点理解
碎碎念 1.去趋势基本概念理解 维基百科给出的解释: 在随机过程, 混沌理论和时间序列分析中, 去趋势波动分析(英文:Detrended Fluctuation Analysis, DFA)是一种判断 ...
- 算法中对数量级的一点理解
前言 最近开始学习算法知识,仅记录自己对算法学习感悟,同时也是方便自己以后复习 1.为什么我们需要了解数量级 我们需要去精确描述一组数据的时候,我们通常使用具体的数据记录,但是我们去理解一组数据的时候 ...
- 对ContentProvider中getType方法的一点理解
在上篇博客中我们介绍了自定义ContentProvider,但是遗漏掉了一个方法,那就是getType,自定义ContentProvider一般用不上getType方法,但我们还是一起来探究下这个方法 ...
最新文章
- 『第27天』Sunos(二)
- 再见,再见,5 * 60 * 1000 //五分钟,再见,再见
- 2021年南宁二中高考成绩查询,2021广西高考圆满结束,6月23日可查询成绩
- 在循环递增一次的数组中插入元素
- UDT中select异常
- G20:奥巴马称美国拥有全球最大最好的网络武器库
- java 选取topn_取Oracle中实现TOPN,选取前几条记录
- vb语言和python语言_用VB“写”Python程序
- 计算机程序计算排列组合(规避溢出)
- 计算View中的子View在View的superview中的坐标
- java util什么意思_java.util中,util是什么意思
- MySQL权限系统(一).The MySQL Access Privilege System 概述
- math库和randon库
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析
- 联想ghost重装系统_如何使用ghost手动安装系统_手动ghost安装系统图文步骤
- vue-element-admin 花裤衩 模板 ,中文版,运行报错解决方案
- java内存垃圾_Java内存区域与垃圾回收
- 邮件服务器邮件群发几个技巧
- 备考2022考研英语二小作文
- quickpcb添加pcb库_quickpcb2005详细步骤教程
热门文章
- java 数学基础_Java中的基础数学
- python2最新版本_Python 2.7.18发布,Python 2的最新版本
- OFFICE技术讲座:一级标点压缩共有几种情形
- Xcode 11.7(12.4)/13.2的signing和sandbox配置截图对比
- 韩国李世石跟韩国AI大战,2负一胜
- fenking是什么意思?
- CPU又烧了,说起来汝可能不信
- RGB数据剪切后保存为JPG格式文件的代码(使用jpeglib)
- 如何判断NSMutableDictionary是否有某个key
- is not in the sudoers files的解决办法