回覆列表
  • 1 # 使用者3971049703351678

    MSDN的解釋:阻塞呼叫執行緒,直到某個執行緒終止時為止。首先明確幾個問題:

    1、一個程序由一個或者多個執行緒組成,執行緒之間有可能會存在一定的先後關係和互斥關係。多執行緒程式設計,首先就是要想辦法劃分執行緒,減少執行緒之間的先後關係和互斥關係,這樣才能保證執行緒之間的獨立性,各自工作,不受影響。Google的MapReduce核心思想就是儘量減少執行緒之間的先後關係和互斥關係。

    2、無論如何地想辦法,執行緒之間還是會存在一定的先後關係和互斥關係,這時候可以使用Thread.Join方法。

    3、一個執行緒在執行的過程中,可能呼叫另一個執行緒,前者可以稱為呼叫執行緒,後者成為被呼叫執行緒。

    4、Thread.Join方法的使用場景:呼叫執行緒掛起,等待被呼叫執行緒執行完畢後,繼續執行。

    5、被呼叫執行緒執行Join方法,告訴呼叫執行緒,你先暫停,我執行完了,你再執行。從而保證了先後關係。

    6、考慮一種有意思的情況:在當前執行緒內呼叫Thread.CurrentThread.Join() 會出現什麼情況?分析:假設當前執行緒為A,此時呼叫執行緒為A,被呼叫執行緒也為A,由於呼叫執行緒A暫停,被呼叫執行緒A(也就是呼叫執行緒A)永遠不會執行完畢,造成死鎖。

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

    using 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

    執行完畢才繼續執行。

  • 中秋節和大豐收的關聯?
  • 可以接受別人的柺杖嗎?