天天看點

一個多線程程式

這個程式會讓你深刻的體會時間片,線程的優先級!!!建議多測試這個程式,一定要看下面的注。

using System;

using System.Collections.Generic;

using System.Text;

using System.Threading;

namespace 一個多線程程式

{

    class ThreadApp

    {

        static int interval;

        //static long interval; //你可以換成long測試過10億機關級的數字

        static void DisplayNumbers()

        {   

            //擷取目前運作線程的Thread對象執行個體

            Thread thisThread = Thread.CurrentThread;

            Console.WriteLine("線程: " + thisThread.Name + " 已開始運作.");

            //循環計數直到結束,在指定的間隔輸出目前計數值

            for (int i = 1; i <= 8 * interval; i++)

            {

                if (i % interval == 0)

                {

                    Console.WriteLine(thisThread.Name + ": 目前計數為 " + i);

                }

            }

            Console.WriteLine("線程 " + thisThread.Name + " 完成.");

        }

        static void Main(string[] args)

        {            

            Console.Write("請輸入一個數字:");

            interval = long.Parse(Console.ReadLine());//擷取使用者輸入的數字

            //定義目前主線程線程對象的名字

            thisThread.Name = "Main Thread";

            //建立新線程對象

            ThreadStart workerStart = new ThreadStart(DisplayNumbers);

            Thread workerThread = new Thread(workerStart);

            workerThread.Name = "Worker Thread"; //設定線程名字

            //如果輸入的數字相對比較大(不一定很大),同時包裹下面這條語句,那麼workerThread線程早完成的機率就大

            //workerThread.Priority = ThreadPriority.AboveNormal;

            workerThread.IsBackground = true; //把workerThread線程設定為背景線程。這個屬性似乎不影響線程進入自己時間片的時間

            workerThread.Start(); //啟動新線程

            DisplayNumbers(); //主線程同步進行計數 即為了Main()方法這個主線程計數

            Console.WriteLine("UESTC_Terry");//和下面等價,幾乎和下面的那條語句同時執行

            ThreadApp.MyMethod();//和上面等價,幾乎和上面的那條語句同時執行

            Console.ReadLine();

        private static void MyMethod()

        {

            Console.WriteLine("UESTC_Terry");

    }

}

/*

   注:Main()方法總是應用程式的第一個線程,因為第一個線程是由.net的運作庫開始執行的。

       是以程式一啟動就相當于啟動了Main()線程,進而不需要顯示的調用Start()方法。而後續的

       線程由應用程式在内部啟動,即應用程式可以選擇啟動哪個線程。是以必須要調用Start()方法

       來啟動相應的線程。

*/   

   注:由于Windows是一個搶先式多任務處理的作業系統。是以Windows會在某個程序中選擇一個線程,該線程運作完它的

       一個時間片後,Windows就會收回控制權,選擇下一個被配置設定時間片的線程。這些時間片非常短(估計不超過幾毫秒)

       是以造成上面這個程式會因輸入數字大小的不同,執行結果大有不同。這正展現了時間片這個思想。

*/

   注:建議一定多測試這個程式,多換些數字來測試,從小到大,int類型不行,就long類型,測試多了,就會對時間片有

       更加深刻的了解。

本文轉自terryli51CTO部落格,原文連結:http://blog.51cto.com/terryli/520661 ,如需轉載請自行聯系原作者

繼續閱讀