
Thread的join方法使用解析
发布日期:2021-05-14 04:37:16
浏览次数:17
分类:博客文章
本文共 2853 字,大约阅读时间需要 9 分钟。
在C#中,Thread用的是比较多的,至少在windows form中使用是比较频繁的。一说到线程,可能马上就会想到界面和线程交互的头疼事,多线程之前数据共享,线程异步等等。这些当然是比较头疼的,只要有信心 ,慢慢来,相信理解不是难事。
对于Thread中的join方法,主要是用来阻塞当前线程,等待子线程完成后再进行运行。也就是其实所谓的线程合并。比如说主线程派生了子线程,如果想让子线程完成之前主线程等待,就需要利用join来进行阻塞。
下面来看下具体代码:
using System; using System.Windows.Forms; using System.Threading; namespace WindowsFormsApplication1 { publicpartialclass Form2 : Form { public Form2() { InitializeComponent(); } privatevoid Form2_Load(object sender, EventArgs e) { Thread t =new Thread(new ThreadStart(ShowInfo)); for (int j =0; j <20; j++) { if (j ==10) { t.Start(); //开始线程 t.Join(); //阻塞当前线程 等待t完成后,再继续 } else { Console.WriteLine("j="+ j); } } } privatevoid ShowInfo() { for (int i =0; i <10; i++) { Console.WriteLine("i="+ i); } } } }
那么从上面代码可以猜测出开始输出的是j从0到9,然后由于线程阻塞,开始输出i,从0到9,最后输出j从11到20,运行结果如下:
但是如果我们不用join方法的时候,会是什么结果呢?按照猜想,主线程和子线程将会各自运行各的。也就是在输出j从0到9后,后面的将是乱序输出,请看结果:
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
下面再更新一个例子上去,这个比较简单一些。
当然开始是添加了join的时候:
using System; using System.Windows.Forms; using System.Threading; namespace ThreadJonCAPTwo { publicpartialclass Form1 : Form { public Form1() { InitializeComponent(); } public Thread tMain; //主线程 privatevoid Form1_Load(object sender, EventArgs e) { CreateMainThread(); } ////// 创建主线程 /// privatevoid CreateMainThread() { tMain =new Thread(new ThreadStart(MainThreadDoing)); tMain.Start(); } ////// 主线程开启 /// privatevoid MainThreadDoing() { int totalNum =20; for (int i =1; i <= totalNum; i++) { Console.WriteLine("我是店主,我卖了"+ i +"条鱼"); if (i ==12) { CreateChildThread(); } } } ////// 创建子线程 /// privatevoid CreateChildThread() { Thread tChild =new Thread(new ThreadStart(ChildThreadDoing)); tChild.Start(); //开启线程 //tChild.Join(); //阻塞主线程 } ////// 子线程开启 /// privatevoid ChildThreadDoing() { int childNum =20; for (int i =1; i <= childNum; i++) { Console.WriteLine("顾客"+ i +"来买鱼啦,呵呵...."); } } } }
得到的结果如下:
但是如果去掉join方法,就会出现下面的结果:
可以看出join结果的作用了吧。目的就是让主线程阻塞,运行主线程,子线程运行完成,主线程再开始,其实本质上说,就是形成一个线程来执行。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月23日 11时25分28秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SQL语言-DDL、DML、DCL
2019-03-12
android设置输出System.out.println
2019-03-12
powerdesigner中怎么给一主键设为自增型auto_increment.
2019-03-12
import Vue from 'vue'的过程
2019-03-12
ubuntu16.04下系统配置
2019-03-12
电容的分类与用途
2019-03-12
国内有哪些比较靠谱的云服务器?
2019-03-12
OPPOReno6Pro+和OPPOReno6Pro的区别 哪个好
2019-03-12
小扎扎学测试笔记打卡-数据库测试mysql
2019-03-12
我的第一篇博客 2021-05-10
2019-03-12
Java中有几种基本数据类型?它们分别占多大字节?
2019-03-12
Java中基本类型的转换规则
2019-03-12
如何将字符串写入文件?
2019-03-12
Js插入元素到数组的头部 unshift
2019-03-12
ie8、ie9获取input文件大小
2019-03-12
原型模式在开源代码中的应用
2019-03-12
职责链模式在开源代码中的应用
2019-03-12
Mapper 接口方法如何与注解里的 SQL 进行绑定的?
2019-03-12
final 在 java 中的作用
2019-03-12
Unity-PlasticSCM usage
2019-03-12