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只能執行其中一個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章