随笔 - 394  文章 - 0  评论 - 946  阅读 - 143万 

  在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();
}

///<summary>
/// 创建主线程
///</summary>
privatevoid CreateMainThread()
{
tMain
=new Thread(new ThreadStart(MainThreadDoing));
tMain.Start();
}

///<summary>
/// 主线程开启
///</summary>
privatevoid MainThreadDoing()
{
int totalNum =20;
for (int i =1; i <= totalNum; i++)
{
Console.WriteLine(
"我是店主,我卖了"+ i +"条鱼");
if (i ==12)
{
CreateChildThread();
}
}
}

///<summary>
/// 创建子线程
///</summary>
privatevoid CreateChildThread()
{
Thread tChild
=new Thread(new ThreadStart(ChildThreadDoing));
tChild.Start();
//开启线程
//tChild.Join(); //阻塞主线程
}

///<summary>
/// 子线程开启
///</summary>
privatevoid ChildThreadDoing()
{
int childNum =20;
for (int i =1; i <= childNum; i++)
{
Console.WriteLine(
"顾客"+ i +"来买鱼啦,呵呵....");
}
}
}
}
复制代码

得到的结果如下:

但是如果去掉join方法,就会出现下面的结果:

可以看出join结果的作用了吧。目的就是让主线程阻塞,运行主线程,子线程运行完成,主线程再开始,其实本质上说,就是形成一个线程来执行。

posted on   程序诗人  阅读(3427)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2010-08-10 GridView单元格合并 【转】
2010-08-10 利用ASP.NET AJAX的Timer讓GridView每隔一段時間做到自動換頁的功能
2010-08-10 利用JQuery一步步打造无缝滚动新闻
2010-08-10 JQuery中text()、html()和val()的区别
点击右上角即可分享
微信分享提示