關於C#中Thread.Join()的一點理解

pamxy發表於2013-10-12

轉自:http://www.cnblogs.com/slikyn/articles/1525940.html

      今天是第一次在C#中接觸Thread,自己研究了一下其中Thread.Join()這個方法,下面談談自己的理解。

  

      Thread.Join()在MSDN中的解釋很模糊:Blocks the calling thread until a thread terminates

有兩個主要問題:1.什麼是the calling thread?

                       2.什麼是a thread? 

 

       首先來看一下有關的概念: 我們執行一個.exe檔案實際上就是開啟了一個程式,同時開啟了至少一個執行緒,

但是真正幹活的是執行緒,就好比一個Team有好幾個人,但是真正幹活的是人不是Team. 

      具體到程式碼來說,以Console Application為例:程式Test.exe從Main函式開始執行,實際上是有一個執行緒

在執行Main函式,我們稱作MainThread.假如我們在Main函式中宣告瞭一個Thread,稱作NewThread,並且呼叫了

NewThread.Start()的方法,那麼 MainThread在處理Main函式裡面的程式碼時遇到NewThread.Start()時,就會

去呼叫NewThread.

       基於上面的討論,我們可以得出結論:在我們剛才的例子中the calling thread就是MainThread,而a thread

指的洽洽就是MainThread呼叫的NewThread執行緒。 

       現在回到MSDN的解釋,我們可以這麼翻譯:當NewThread呼叫Join方法的時候,MainThread就被停止執行,

直到NewThread執行緒執行完畢這樣就好理解了吧O(∩_∩)O哈哈~ 

 

       好了,前面分析完了,現在來看測試用例吧:

 

Titleusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Test
{
    class TestThread
    {
        private static void ThreadFuncOne()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(Thread.CurrentThread.Name +"   i =  " + i);
            }
            Console.WriteLine(Thread.CurrentThread.Name + " has finished");
        }

        static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "MainThread";

            Thread newThread = new Thread(new ThreadStart(TestThread.ThreadFuncOne));
            newThread.Name = "NewThread";

            for (int j = 0; j < 20; j++)
            {
                if (j == 10)
                {
                    newThread.Start();
                    newThread.Join();
                }
                else
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "   j =  " + j);
                }
            }
            Console.Read();
        }
    }
}

 下面是測試的結果:

 

 


 

結論:從測試中我們可以很清楚的看到MainThread在NewThread.Join被呼叫後被阻塞,直到NewThread

        執行完畢才繼續執行。 


相關文章