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

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.Join

Current thread: Thread2

Current thread: Thread2
Thread1: WaitSleepJoin
Thread2: Running


Current 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.kler.cn/a/536280.html

相关文章:

  • NetCore Consul动态伸缩+Ocelot 网关 缓存 自定义缓存 + 限流、熔断、超时 等服务治理
  • 【STM32系列】利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程)
  • 深入理解linux中的文件(下)
  • 【LeetCode】152、乘积最大子数组
  • 计算机毕业设计hadoop+spark+hive民宿推荐系统 酒店推荐系统 民宿价格预测 酒店价预测 机器学习 深度学习 Python爬虫 HDFS集群
  • 哈希(Hashing)在 C++ STL 中的应用
  • 轻量化开发实践!Code Server在香橙派Zero3上的完美运行与配置方案
  • 市场柱线-机器人-《广东省建设现代化产业体系2025年行动计划》-提到大力发展人形机器人等具身智能机器人
  • bigemap pro如何裁剪栅格数据?
  • 路由器如何进行数据包转发?
  • 【LeetCode】152、乘积最大子数组
  • 音频进阶学习十一——离散傅里叶级数DFS
  • PostGIS:使用shp2pgsql、pgsql2shp、OGR2OGR函数进行数据导入、导出
  • 基础篇05-图像直方图操作
  • OpenHarmony上运行Ollama玩转本地大模型
  • React 与 Next.js
  • D. CGCDSSQ
  • 十三、Dockerfile 常用镜像创建
  • RabbitMQ业务场景面试题
  • yum 安装mysql
  • VDN 微服务架构搭建篇(三)基于 Nacos 的 Spring Cloud Gateway 动态路由管理
  • 如何使用iframe来渲染ThingsBoard仪表盘
  • LabVIEW与PLC交互
  • 【Spring】什么是Spring?
  • SAP物料账未分配差异-采购发票数量大于库存数量
  • 多无人机--强化学习