当前位置: 首页 > news >正文

c#中Thread.Join()方法的经典示例

在 C# 中,Thread.Join 是一个非常有用的方法,它可以让主线程(调用线程)等待子线程(被调用线程)执行完毕后再继续执行。

1、经典示例1

using System;
using System.Threading;public class Example
{static Thread thread1, thread2;public static void Main(){thread1 = new Thread(ThreadProc);thread1.Name = "Thread1";thread1.Start();thread2 = new Thread(ThreadProc);thread2.Name = "Thread2";thread2.Start();Console.ReadKey();}private static void ThreadProc(){Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);if (Thread.CurrentThread.Name == "Thread1" &&thread2.ThreadState != ThreadState.Unstarted){Console.WriteLine("thread2.Join");thread2.Join(); }Thread.Sleep(1000);Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);Console.WriteLine("Thread1: {0}", thread1.ThreadState);Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);}
}

运行结果


Current thread: Thread1
thread2.JoinCurrent thread: Thread2Current thread: Thread2
Thread1: WaitSleepJoin
Thread2: RunningCurrent thread: Thread1
Thread1: Running
Thread2: Stopped

这个例子演示了“Thread.Join 会阻塞调用线程,直到被调用线程完成执行”

2、经典示例2

using System.Threading;
using System;class TestThread
{private static void ThreadTst(){Console.WriteLine("  " + Thread.CurrentThread.Name + "   开始执行");for (int i = 0; i < 10; i++){Console.WriteLine("     " + Thread.CurrentThread.Name + "   i =  " + i);Thread.Sleep(10);}Console.WriteLine("  " + Thread.CurrentThread.Name + "   执行完毕");}static void Main(string[] args){//程序调用了Main()函数时,就起动了一个进程,同时也启动了一个线程[这个线程就是主线程].Thread.CurrentThread.Name = "MainThread";//创建第一个线程Thread tA = new Thread(new ThreadStart(TestThread.ThreadTst));tA.Name = "线程A";Thread tB = new Thread(new ThreadStart(TestThread.ThreadTst));tB.Name = "线程B";Thread tC = new Thread(new ThreadStart(TestThread.ThreadTst));tC.Name = "线程C";Thread tD = new Thread(new ThreadStart(TestThread.ThreadTst));tD.Name = "线程D";for (int z = 0; z < 20; z++){if (z == 3){Console.WriteLine("tA.Start");tA.Start();Console.WriteLine("tB.Start");tB.Start();}else if (z == 6){Console.WriteLine("tA.Join");tA.Join();Console.WriteLine("tB.Join");tB.Join();}else if (z == 9){Console.WriteLine("tC.Start");tC.Start();Console.WriteLine("tD.Start");tD.Start();}else{Console.WriteLine(Thread.CurrentThread.Name + "   z =  " + z);}}Console.Read();}
}

运行结果

MainThread   z =  0
MainThread   z =  1
MainThread   z =  2
tA.Start
tB.Start
MainThread   z =  4
MainThread   z =  5
tA.Join线程A   开始执行线程A   i =  0线程B   开始执行   ->注意这里并没有返回调用线程,这里是线程B线程B   i =  0线程A   i =  1线程B   i =  1线程A   i =  2线程B   i =  2线程A   i =  3线程B   i =  3线程A   i =  4线程B   i =  4线程A   i =  5线程B   i =  5线程A   i =  6线程B   i =  6线程A   i =  7线程B   i =  7线程A   i =  8线程B   i =  8线程B   i =  9线程A   i =  9线程A   执行完毕线程B   执行完毕
tB.Join              ->注意线程B已经执行完毕了
MainThread   z =  7
MainThread   z =  8
tC.Start
tD.Start
MainThread   z =  10
MainThread   z =  11
MainThread   z =  12
MainThread   z =  13
MainThread   z =  14
MainThread   z =  15
MainThread   z =  16
MainThread   z =  17
MainThread   z =  18
MainThread   z =  19线程C   开始执行    ->线程C是等主线程结束后才开始执行的线程C   i =  0线程D   开始执行线程D   i =  0线程C   i =  1线程D   i =  1线程C   i =  2线程D   i =  2线程C   i =  3线程D   i =  3线程C   i =  4线程D   i =  4线程C   i =  5线程D   i =  5线程C   i =  6线程D   i =  6线程C   i =  7线程D   i =  7线程C   i =  8线程D   i =  8线程C   i =  9线程D   i =  9线程C   执行完毕线程D   执行完毕

这个例子主要目的是对比使用join(线程A、)和未使用join(线程C)的区别

http://www.lryc.cn/news/532925.html

相关文章:

  • 深入了解越权漏洞:概念、危害与防范
  • MySQL 数据库编程-C++
  • dl学习笔记(9):pytorch数据处理的完整流程
  • wps中的vba开发
  • 力扣 LCR 078 合并K个升序链表
  • 【hive】记一次hiveserver内存溢出排查,线程池未正确关闭导致
  • React Native 开发 安卓项目构建工具Gradle的配置和使用
  • IntelliJ IDEA新版本的底部version control(或git)里local change窗口显示配置修改详细教程
  • MySQL三大日志——binlog、redoLog、undoLog详解
  • MCU应用踩坑笔记(ADC 中断 / 查询法)
  • 32.日常算法
  • 通过docker安装部署deepseek以及python实现
  • 批量提取word表格数据到一个excel
  • 使用 Axios 获取用户数据并渲染——个人信息设置
  • DeepSeek在FPGA/IC开发中的创新应用与未来潜力
  • 【GitLab CI/CD 实践】从 0 到 1 搭建高效自动化部署流程
  • 【DeepSeek-R1训练笔记】随手记录一些训练log
  • 【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具04
  • 「全网最细 + 实战源码案例」设计模式——策略模式
  • [MoeCTF 2022]baby_file
  • 【AI日记】25.02.07 探索开辟第二战场
  • path 路径模块
  • SpringBoot中的多环境配置管理
  • mac下生成.icns图标
  • 关于JS继承的七种方式和理解
  • 储能系统-系统架构
  • AI智算-k8s部署DeepSeek Janus-Pro-7B 多模态大模型
  • 【截图】selenium自动通过浏览器截取指定元素div的图片
  • 如何导入第三方sdk | 引入第三方jar 包
  • HarmonyOS 5.0应用开发——ContentSlot的使用