1. 程式人生 > >C#多線程的用法3-線程間的協作Join

C#多線程的用法3-線程間的協作Join

con ren err ati cat string format reads threads

在創建多線程應用程序時,如何確保線程間的協作往往比讓線程工作更重要。

線程間的協作最簡單的方式是采用Join來進行,如下:

/// <summary>
        /// 多線程協作-Join方式
        /// 解決線程間同步工作問題
        /// </summary>
        private static void MultiThreadSynergicWithJoin()
        {
            int[] array = new int[3];
            Thread producer = null, customer = null;
            producer = new Thread(() =>
            {
                Console.WriteLine(String.Format("{0} start work", Thread.CurrentThread.Name));
                Random random = new Random();
                try
                {
                    array[0] = random.Next(10);
                    array[1] = random.Next(10);
                    array[2] = random.Next(10);
                    Console.WriteLine(String.Format("{0} work over", Thread.CurrentThread.Name));
                    Thread.Sleep(1000);
                }
                catch (ThreadAbortException ex)
                {
                    Console.WriteLine(String.Format("Sub Thread {0} Abort", Thread.CurrentThread.Name));
                }
            })
            {
                Name = "producer"
            };
            customer = new Thread(() =>
            {
                Console.WriteLine(String.Format("{0} start work", Thread.CurrentThread.Name));
               
                try
                {
                    producer.Join();
                    Console.WriteLine(array[0]);
                    Console.WriteLine(array[1]);
                    Console.WriteLine(array[2]);
                    Console.WriteLine(String.Format("{0} work over", Thread.CurrentThread.Name));
                }
                catch (ThreadInterruptedException ex)
                {
                    Console.WriteLine(String.Format("Sub Thread {0} Interrupted", Thread.CurrentThread.Name));
                }
            })
            {
                Name = "customer"
            };

            Console.WriteLine("Main Thread");
            customer.Start();
            producer.Start();

            Console.WriteLine("Main Thread Wait Sub Thread");
            
        }

說明:

1、在調用producer.Join()時,customer線程將暫停執行而進入等待producer線程執行的過程。在producer線程執行完畢後,customer線程才返回繼續執行後續代碼。

2、producer與customer誰先啟動無所謂,但應保證在調用producer.Join時滿足:producer線程必須啟動過,即調用過Start方法,如果在調用Join時,被調用線程已經結束或終止,Join方法將立即返回執行後續代碼

3、對於多線程間的協作Join方式較為適合線程數量不多,對資源需求有明確先後順序的情況(個人總結,如有錯誤,歡迎拍磚)。

C#多線程的用法3-線程間的協作Join