博客
关于我
Thread的join方法使用解析
阅读量:582 次
发布时间:2019-03-11

本文共 2641 字,大约阅读时间需要 8 分钟。

C#中的Thread在Windows Forms应用中应用广泛,常常引发界面和线程交互的挑战。关于线程操作,开发者通常会遇到数据共享、线程异步等问题,这些确实需要一定的技巧才能处理。

在讨论Thread.Join方法时,需要明确其作用。Join方法的主要目的在于阻塞当前线程,等待子线程完成后再继续执行。例如,在主线程启动了子线程后,若希望主线程等待子线程完成,可以使用Join方法实现线程合并。

以下代码示例可以帮助理解Join方法的实际应用:

using System;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void 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(); // 阻塞当前线程,等待子线程完成
}
else
{
Console.WriteLine("j=" + j);
}
}
}
private void ShowInfo()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("i=" + i);
}
}
}
}

通过上述代码可以观察到输出结果:j从0到9依次输出,随后由于Join方法的阻塞,主线程会等待子线程完成后再继续输出j从11到20。这样可以有效地观察到Join方法的实际效果。

如果去掉Join方法,主线程和子线程将同时执行,输出结果会变得不规则,可能出现乱序输出的情况。

另一个简化的示例:

using System;
using System.Threading;
namespace ThreadJonCAPTwo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Thread tMain; // 主线程
private void Form1_Load(object sender, EventArgs e)
{
CreateMainThread();
}
private void CreateMainThread()
{
tMain = new Thread(new ThreadStart(MainThreadDoing));
tMain.Start();
}
private void MainThreadDoing()
{
int totalNum = 20;
for (int i = 1; i <= totalNum; i++)
{
Console.WriteLine("我是店主,我卖了" + i + "条鱼");
if (i == 12)
{
CreateChildThread();
}
}
}
private void CreateChildThread()
{
Thread tChild = new Thread(new ThreadStart(ChildThreadDoing));
tChild.Start(); // 开启线程
// tChild.Join(); // 阻塞主线程
}
private void ChildThreadDoing()
{
int childNum = 20;
for (int i = 1; i <= childNum; i++)
{
Console.WriteLine("顾客" + i + "来买鱼啦,呵呵....");
}
}
}
}

在上述代码中,若保留Join方法,主线程会在子线程完成后继续执行,结果会呈现出“店主卖鱼”和“顾客买鱼”的明确顺序。而若移除Join方法,则可能出现乱序输出。

通过以上例子可以清晰地看出Join方法的作用,即阻塞主线程,等待子线程完成后再继续执行。这种机制对于多线程应用的有效管理至关重要。

转载地址:http://uflvz.baihongyu.com/

你可能感兴趣的文章
nghttp3使用指南
查看>>
Nginx
查看>>
nginx + etcd 动态负载均衡实践(三)—— 基于nginx-upsync-module实现
查看>>
nginx + etcd 动态负载均衡实践(二)—— 组件安装
查看>>
nginx + etcd 动态负载均衡实践(四)—— 基于confd实现
查看>>
Nginx + Spring Boot 实现负载均衡
查看>>
Nginx + uWSGI + Flask + Vhost
查看>>
Nginx - Header详解
查看>>
Nginx - 反向代理、负载均衡、动静分离、底层原理(案例实战分析)
查看>>
nginx 1.24.0 安装nginx最新稳定版
查看>>
nginx 301 永久重定向
查看>>
nginx css,js合并插件,淘宝nginx合并js,css插件
查看>>
Nginx gateway集群和动态网关
查看>>
Nginx Location配置总结
查看>>
Nginx log文件写入失败?log文件权限设置问题
查看>>
Nginx Lua install
查看>>
nginx net::ERR_ABORTED 403 (Forbidden)
查看>>
Nginx SSL私有证书自签,且反代80端口
查看>>
Nginx upstream性能优化
查看>>
Nginx 中解决跨域问题
查看>>