• C#多线程Thread.Join()的详解


    class TestThread
        {
            private static void FirstThreadFun()
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "   i =  " + i);
                    
                }
                Console.WriteLine(Thread.CurrentThread.Name + " 执行完毕");
            }
    static void Main(string[] args)
            {
                //程序调用了Main()函数时,就起动了一个进程,同时也启动了一个线程[这个线程就是主线程].
                Thread.CurrentThread.Name = "MainThread";
                  
                //创建第一个线程
                Thread firstThread = new Thread(new ThreadStart(TestThread.FirstThreadFun));
                //取名为 firstThread
                firstThread.Name = "firstThread";
    
                for (int z = 0; z < 20; z++)
                {
                    if (z == 10)
                    {
                        firstThread.Start();
                        firstThread.Join();
                    }
                    else
                    {
                        Console.WriteLine(Thread.CurrentThread.Name + "   z =  " + z);
                    }
                }
                Console.Read();
            }
        }
    }

    运行结果:

     

    总结:

    1.任何程序在执行时,至少有一个主线程。 

    2.firstThread.Start()启动了一个线程后,用firstThread.Join()这个方法加入一个线程[即:暂停了主线程的运行],那么操作系统就会马上执行这个新加入的线程

    3.Join 就是加入的意思,也就是说新创建的线程加入到进程中,并马上执行

    4.如果只是 firstThread.Start(),把 firstThread.Join()方法注释掉会是什么结果?

    下面的图是运行结果:

     

    从运行结果可以看出:

    1.如果只是 firstThread.Start(),注释掉 firstThread.Join()这个方法后,主线程并不会暂停[也就是说,firstThread 线程并不会马上执行]

    2.所以要想一个线程在启动后就马上执行,必须调用 Thread.Join()方法. 

    3.到这里,Thread.Join()这个方法的作用也就明显了:当调用了 Thread.Join()方法后,当前线程会立即被执行,其他所有的线程会被暂停执行.

    当这个线程执行完后,其他线程才会继续执行.

    我们通过其中提供的Thread类来创建和控制线程,ThreadPool类用于管理线程池等。
    (此外还提供解决了线程执行安排,死锁,线程间通讯等实际问题的机制。)

    Thread类有几个至关重要的方法,描述如下:
    Start():启动线程;
    Sleep(int):静态方法,暂停当前线程指定的毫秒数; 
    Abort():通常使用该方法来终止一个线程;
    Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复; 
    Resume():恢复被Suspend()方法挂起的线程的执行; 

     
     
  • 相关阅读:
    [Debug]驱动程序调测方法与技巧
    [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
    ios多线程-GCD基本用法
    用PHP抓取页面并分析
    IOS开发-KVC
    IOS开发-KVO
    JavaScript垃圾回收(三)——内存泄露
    JavaScript垃圾回收(二)——垃圾回收算法
    JavaScript垃圾回收(一)——内存分配
    JavaScript闭包(二)——作用
  • 原文地址:https://www.cnblogs.com/lfxiao/p/6709312.html
Copyright © 2020-2023  润新知