C# 线程之Join()

对于Thread.Join()方法,MSDN给的定义是:在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止。

很不好理解,Join()其实是让调用该线程的线程等待,只到被调用的线程执行完毕。

如以下代码说明:

    public class Apha
    {

        public void methThread()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(Thread.CurrentThread.Name +": i= " + i);
            }
        }
    }

 public class Simple
    {
        static int Main()
        {

            Apha apha = new Apha();
            Thread.CurrentThread.Name = "Main Thread";
            Thread o_thread = new Thread(new ThreadStart(apha.methThread));
            o_thread.Name = "Sub Thread";
            //o_thread.Name = "Sub Threadq";       //报错:This property has already been set and cannot be modified.
            for (int j = 0; j < 20; j++)
            {
                if (j == 10)
                {
                    o_thread.Start();
                    //o_thread.Abort();                       //如果此代码存在,则o_thread不会执行。因为并不是立即执行.Start()方法。

                    //o_thread.Start();                        //报错: Thread is running or terminated; it cannot restart.
                    o_thread.Join();
                }
                else
                {
                    Console.WriteLine(Thread.CurrentThread.Name + ": j = " + j);
                }
            }
            Console.ReadLine();
            return 0;
        }
    }

代码中的“o_thread.Join();”要是删除的话,执行结果如下:即主线程和o_thread会交替执行

代码中的“o_thread.Join();”要是不删除的话,执行结果如下:即主线程需等待o_thread线程执行完毕,然后才执行,也就是所说的Join()的作用。

 

补充:

在上面代码中有两处有注释的地方

1.Thread.CurrentThread.Name只能赋值一次

2.调用o_thread.Start()并不是立即执行。

3.线程一旦终止(Abort()),不能用Start()再启动,会报错。

4.Thread.CurrentThreads是静态属性。

所谓静态属性,就是这个类所有对象所公有的属性,不管你创建了多少个这个类的实例,但是类的静态属性在内存中只有一个。很容易理解CurrentThread为什么是静态的——虽然有多个线程同时存在,但是在某一个时刻,CPU只能执行其中一个。

你可能感兴趣的:(ASP.NET,join,c#,thread,class)