C#一個簡單多線程的實例

很多初學者聽到線程會覺得晦澀難懂,很多資料一堆專有名詞也是讓人心煩意亂,本着學習加分享的態度,這裏做一個簡單的實例分享幫助初學者們初識多線程。 
首先大概講述一下多線程和多進程的區別,任務管理器裏各種不同的進程就是多進程,或者是你同時運行多個”.exe’程序就可以理解爲多進程,多進程是要更多消耗CPU資源的。 
多線程是相對於進程裏更小的單位,比如3個線程在1個進程裏進行不同的操作,他們所擁有的資源就是那個進程裏的資源,不會佔用更多資源,只是通過線程更合理的分配資源。 
好,大概區分清楚兩者後我們進入線程模式!

一.單線程 
在很久以前的MS-DOS時代時代,都是單任務的,比如說我想玩潛艇大戰和聽歌,很抱歉,只能選擇玩潛艇大戰或者聽歌,不能同時進行。 
所以我只能先玩潛艇大戰,玩膩了就關掉遊戲打開音樂播放器聽一首《七里香》來舒緩心緒,模擬的程序如下:

 public static void game()
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") + " 玩潛艇大戰");
        }

        public static void music()
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") + " 聽七里香");
        }
        static void Main(string[] args)
        {
            game();
            music();
            Console.ReadKey();
        }
  • 1

我們控制檯輸出的結果爲: 
2016-11-15 04:30:56.724 玩潛艇大戰 
2016-11-15 04:30:56.755 聽七里香

二.雙線程 
當然,我們現在的時代大可不必那麼老實的先幹什麼再幹什麼,我們可以選擇邊玩遊戲,邊聽歌。模擬代碼如下:

public static void game()
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") + " 玩潛艇大戰");
        }

        public static void music()
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") + " 聽七里香");
        }
        static void Main(string[] args)
        {
            Thread t1 = new Thread(new ThreadStart(game));//開始一個玩遊戲的線程
            Thread t2 = new Thread(new ThreadStart(music));//開始一個聽音樂的線程
            t1.Start();
            t2.Start();
            Console.ReadKey();
        }
  • 1

控制檯輸出結果爲: 
2016-11-15 04:43:48.987 玩潛艇大戰 
2016-11-15 04:43:48.988 聽七里香

2016-11-15 04:45:19.315 聽七里香 
2016-11-15 04:45:19.315 玩潛艇大戰

2016-11-15 04:46:38.513 聽七里香 
2016-11-15 04:46:38.512 玩潛艇大戰 
這三組結果可以看出,運用線程後玩遊戲和聽音樂可以同時展開,兩個任務不分先後時間差明顯比單線程模式要少,更合理的利用了資源。

三.三線程 
其實以上的代碼中還隱藏了一個線程,就是主線程Main(string[] args),我們下面再改進一下代碼看看三個線程運行時的情況。 
核心代碼更改如下:

static void Main(string[] args)
        {
            Thread t1 = new Thread(new ThreadStart(game));//開始一個玩遊戲的線程
            Thread t2 = new Thread(new ThreadStart(music));//開始一個聽音樂的線程
            t1.Priority = ThreadPriority.BelowNormal;
            t2.Priority = ThreadPriority.Lowest;
            t1.Start();
            t2.Start();
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss.fff") +" 邊玩遊戲邊聽音樂");
            Console.ReadKey();
        }
  • 1

控制檯輸出結果: 
2016-11-15 05:01:15.598 聽七里香 
2016-11-15 05:01:15.575 邊玩遊戲邊聽音樂 
2016-11-15 05:01:15.598 玩潛艇大戰

2016-11-15 05:03:25.966 聽七里香 
2016-11-15 05:03:25.964 邊玩遊戲邊聽音樂 
2016-11-15 05:03:25.965 玩潛艇大戰

2016-11-15 05:03:50.022 聽七里香 
2016-11-15 05:03:50.001 邊玩遊戲邊聽音樂 
2016-11-15 05:03:50.001 玩潛艇大戰

不知道大家注意到沒有,主線程每次都是先執行的,並且聽音樂好像也總是比玩遊戲要晚執行,因爲代碼裏我有一個改動:

            t1.Priority = ThreadPriority.BelowNormal;
            t2.Priority = ThreadPriority.Lowest;
  • 1

沒錯,我設置了線程的優先級,t2代表聽音樂的線程優先級比t1玩遊戲的優先級要低。對應現實來說就好像我要先打開遊戲玩着玩着覺得配樂不好聽,所以我選擇靜音再點開我最愛的《七里香》,這樣玩遊戲就更加帶勁了!

四.線程的優先級 
線程的優先級可以通過Thread類Priority屬性設置,Priority屬性是一個ThreadPriority型枚舉,列舉了5個優先等級:AboveNormal、BelowNormal、Highest、Lowest、Normal。普通線程的優先級默認爲Normal;如果想有更高的優先級,可設置爲AboveNormal或Highest;如果想有較低的優先級,可設置爲BelowNormal或Lowest。 
也許有人會問那之前的例子主線程總是先完成是不是優先級默認要高呢?其實不是的,主線程和工作線程的優先級相同,也是交替進行,被執行的概率大體相同,至於每次先完成是因爲主線程會先啓動,只有啓動了主線程才能開啓其他工作線程。 
要注意的是:系統優先執行優先級較高的線程,但這隻意味着優先級較高的線程佔有更多的CPU時間,並不意味着一定要先執行完優先級較高的線程,纔會執行優先級較低的線程。

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