多線程中的join()



Join,單詞本事就是連接的意思。
先貼出幾段代碼猜猜結果。
 <1>      

 public static int Main()
        {          
            Alpha oAlpha = new Alpha();

            Thread Thread1 = new Thread(delegate() {
                Console.WriteLine("A");               
            });
            Thread1.Start(); 
            Console.WriteLine("a");
            return 0;
        }



結果是先打印 A 還先打印 a ?
  <2>    

public static int Main()
        {          
            Alpha oAlpha = new Alpha();

            Thread Thread1 = new Thread(delegate() {
                Console.WriteLine("A");               
            });
            Thread1.Start(); 
            Thread1.Join();//注意這裏
            Console.WriteLine("a");
            return 0;
        }

結果是先打印 A 還先打印 a ?
------------------------------------------------------
<3>
   static void Main(string[] args)
        {
            //線程A
            Thread ThreadA = new Thread(delegate()
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine("A : " );
                    if (i == 9)
                    {
                        break;
                    }
                    Thread.Sleep(1000);
                }

            });
            //線程B
            Thread ThreadB = new Thread(delegate()
            {
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("B : ");
                    if (i == 4)
                    {
                        break;
                    }
                    Thread.Sleep(1000);
                }
             ThreadA.Join();//在這裏插入線程A
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("C : " );
                    if (i == 4)
                    {
                        break;
                    }
                    Thread.Sleep(1000);
                }
            });
            ThreadA.Start();
            ThreadB.Start();
        }
<4>
   public static int Main()
        {
            Thread.CurrentThread.Join();
            Console.WriteLine("O(∩_∩)O哈哈");
            return 0;
        }
----------------------------------------------------
運行結果:
1 A 和 a不分先後,Thread1線程很簡單啓動耗時非常小,Thread1線程和主線程幾乎是同步的,所以打印A a不分前後根據CPU當時運行環境決定。
         2 先打印A 再打印 a ,因爲Thread1執行了Join(),相當於在主線程中添加了Thread1線程,就是說只有當Thread1執行結束之後主線程才能繼續執行。換句話說在主線程中嵌了一段代碼,只有這段代碼執行結束(這裏不要以爲調用了Join()線程Thread1會從頭開始執行,不明白這句話可以運行下第3端程序),主線程纔可以繼續執行後面的代碼。
         3 前5秒 A B交替出現,然後A出現5次,C出現5次。
如果註釋掉ThreadA.Join(),那麼結果是前5秒AB 交替出現 後5秒AC交替出現。
這裏我就不再羅嗦了。還是那樣線程B中join了線程A只有A執行結束,纔可以繼續執行線程B中剩下的代碼。
join其實就是使異步執行線程轉爲同步執行。
         4 主線程被終止

本文出自 “學習筆記” 博客,請務必保留此出處http://zjj1211.blog.51cto.com/1812544/368175

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