C#多線程詳解(三)

來源:互聯網
上載者:User

繼續上一節的問題:調換兩個新建立的線程啟動順序會是什麼結果?

using System;

using System.Threading;

namespace Test
{
    class TestThread
    {
        private static void FirstThreadFun()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "   i =  " + i);
            }
            Console.WriteLine(Thread.CurrentThread.Name + "的優先順序:" + Thread.CurrentThread.Priority);
            Console.WriteLine(Thread.CurrentThread.Name + " 執行完畢");
        }

        private static void SecondThreadFun()
        {
            for (int j = 0; j < 10; j++)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "   j =  " + j);
            }
            Console.WriteLine(Thread.CurrentThread.Name + "的優先順序:" + Thread.CurrentThread.Priority);
            Console.WriteLine(Thread.CurrentThread.Name + " 執行完畢");
        }

        static void Main(string[] args)
        {
            //程式調用了Main()函數時,就起動了一個進程,同時也啟動了一個線程[這個線程就是主線程].
            Thread.CurrentThread.Name = "MainThread";
                        
            Thread secondThread = new Thread(new ThreadStart(TestThread.SecondThreadFun));
            //取名為 secondThread
            secondThread.Name = "secondThread";
            //設定線程的優先順序為AboveNormal[在所有建立的新線程中,執行順序為第二]
            secondThread.Priority = ThreadPriority.AboveNormal;

            //建立第一個線程
            Thread firstThread = new Thread(new ThreadStart(TestThread.FirstThreadFun));
            //取名為 firstThread
            firstThread.Name = "firstThread";
            //設定線程的優先順序為最進階[在所有建立的新線程中,最先執行.線程優先順序預設為Normal,共5 級:Highest,AboveNormal,Normal,BelowNormal,Lowest]
            firstThread.Priority = ThreadPriority.Highest;

            for (int z = 0; z < 20; z++)
            {
                if (z == 10)

                {

         //這裡與上一節的代碼略有不同

                    secondThread.Start();

                    firstThread.Start();
                    firstThread.Join();

                    secondThread.Join();
                }
                else
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "   z =  " + z);
                }
            }
            Console.Read();
        }
    }

}

運行結果:

圖1                                                  圖2                                                 圖3

 

總結:

1.上面三個圖的運行結果都不一樣,但有一點是相同的.主線程是最先執行的[不管新建立的線程層級如何]

2.當滿足新線程啟動條件後,secondThread總是先執行,是因為secondThread線程先啟動了[儘管firstThread優先順序高於secondThread] .

3.當secondThread運行了一小段時間後,firstThread線程接著執行.

4.當兩個新建立的線程都執行完畢後,主線程繼續執行.

注:

1.多線程同時工作的時候,優先順序高的線程要先啟動[Thread.Start()],先加入[Thread.Join()].

2.這個例子裡因為啟動順序搞錯了,也可以看出多線程,並不是說所有的線程同時工作,而是輪流程執行的.

 

Thread.ThreadState 屬性

這個屬性代表了線程運行時狀態,在不同的情況下有不同的值,我們有時候可以通過對該值的判斷來設計程式流程。
ThreadState 屬性的取值如下:
Aborted:線程已停止;
AbortRequested:線程的Thread.Abort()方法已被調用,但是線程還未停止;
Background:線程在後台執行,與屬性Thread.IsBackground有關;
Running:線程正在正常運行;
Stopped:線程已經被停止;
StopRequested:線程正在被要求停止;
Suspended:線程已經被掛起(此狀態下,可以通過調用Resume()方法重新運行);
SuspendRequested:線程正在要求被掛起,但是未來得及響應;
Unstarted:未調用Thread.Start()開始線程的運行;
WaitSleepJoin:線程因為調用了Wait(),Sleep()或Join()等方法處於封鎖狀態;

上面提到了Background狀態表示該線程在後台運 行,那麼後台啟動並執行線程有什麼特別的地方呢?其實後台線程跟前台線程只有一個區別,那就是後台線程不妨礙程式的終止。一旦一個進程所有的前台線程都終止 後,CLR(通用語言運行環境)將通過調用任意一個存活中的後台進程的Abort()方法來徹底終止進程。

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.