2017年8月24日 星期四

C#中Thread.Join()




[Ref] 

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

但是真正幹活的是線程,就好比一個Team有好幾個人,但是真正幹活的是人不是Team.

      具體到代碼來說,以Console Application為例:程序Test.exe從Main函數開始運行,實際上是有一個線程

在執行Main函數,我們稱作MainThread.假如我們在Main函數中聲明了一個Thread,稱作NewThread,並且調用了

NewThread.Start()的方法,那麼 MainThread在處理Main函數里面的代碼時遇到NewT​​hread.Start()時,就會

去調用NewThread.

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

指的洽洽就是MainThread調用的NewThread線程。

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

直到NewT​​hread線程執行完畢。這樣就好理解了吧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被調用後被阻塞,直到NewT​​hread
        執行完畢才繼續執行。

沒有留言:

張貼留言