C#多線程總結

C#多線程總結

1、 首先多線程啓動必須包含using System.Threading;這個頭文件。必須使用Thread這個類。

Thread 這個類有如下常用的屬性:

對於Thread類更多:

https://msdn.microsoft.com/zh-cn/library/system.threading.thread%28v=vs.110%29.aspx

IsAlive

指示線程的當前狀態(true|false)

IsBackground

指示線程是否爲後臺線程

Name

獲取或設置線程的名字(線程默認爲前臺線程)

Priority

獲取設置線程的優先級(其中屬性值爲枚舉類型enum ThreadPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest })

任何線程創建範圍內try/catch/finally塊,當線程開始執行便不再與其有任何關係。

2、線程用Thread類來創建, 通過ThreadStart委託來指明方法從哪裏開始運行,下面是ThreadStart委託如何定義的:

public delegate voidThreadStart();

3、啓動線程的方法:有三種。

第一種:使用委託來調用要執行的函數。

//ThreadStart委託不支持傳入參數

       public static void  Test1()

       {

           Thread t = new Thread(new ThreadStart(Go));

           t.Start();

           Go();

        }

       public static void Go()

       {

           Console.WriteLine(i++);

        }

第二種:直接把要調用的函數放在線程中,然後啓動。

public static void Test2()

       {

           Thread t = new Thread(Go);

           t.Start();

        }

第三種:如果線程的函數比較簡單可以直接寫在匿名委託裏。

public static void Test3()

       {

           Thread t = new Thread(delegate() { Console.WriteLine(i++); });

           t.Start();

        }

4、.NET framework定義了另一個版本的委託叫做ParameterizedThreadStart,它可以接收一個單獨的object類型參數,而且這個方法的參數必須是object類型的。ParameterizedThreadStart的特性是在使用之前我們必需對我們想要的類型(這裏是bool)進行裝箱操作,並且它只能接收一個參數。 一個替代方案是使用一個匿名方法調用一個普通的方法

publicdelegate void ParameterizedThreadStart (object obj);

publicstatic void Test4()

        {

            Thread t = new Thread(newParameterizedThreadStart(Go1));

            t.Start(true);

            t.Priority=ThreadPriority.

            Go1(false);

           

        }

publicstatic void Go1(object b)

        {

            bool b1=(bool)b;

           Console.WriteLine(b1?"HELLO":"hello");

        }

、C# Thread類:判斷多個線程是否都結束的兩種方法

5、確定所有線程是否都完成了工作的方法有很多,如可以採用類似於對象計數器的方法,所謂對象計數器,就是一個對象被引用一次,這個計數器就加1,銷燬引用就減1,如果引用數爲0,則垃圾蒐集器就會對這些引用數爲0的對象進行回收。

方法一:線程計數器

線程也可以採用計數器的方法,即爲所有需要監視的線程設一個線程計數器,每開始一個線程,在線程的執行方法中爲這個計數器加1,如果某個線程結束(在線程執行方法的最後爲這個計數器減1),爲這個計數器減1。然後再開始一個線程,按着一定的時間間隔來監視這個計數器,如是棕個計數器爲0,說明所有的線程都結束了。當然,也可以不用這個監視線程,而在每一個工作線程的最後(在爲計數器減1的代碼的後面)來監視這個計數器,也就是說,每一個工作線程在退出之前,還要負責檢測這個計數器。使用這種方法不要忘了同步這個計數器變量啊,否則會產生意想不到的後果。

方法二:使用Thread.join方法

join方法只有在線程結束時才繼續執行下面的語句。可以對每一個線程調用它的join方法,但要注意,這個調用要在另一個線程裏,而不要在主線程,否則程序會被阻塞的。實例:

    private static void threadMethod(Objectobj) 

    { 

       Thread.Sleep(Int32.Parse(obj.ToString())); 

        Console.WriteLine(obj + "毫秒任務結束"); 

    } 

    private static void joinAllThread(objectobj) 

    { 

        Thread[] threads = obj asThread[]; 

        foreach (Thread t in threads) 

            t.Join(); 

        Console.WriteLine("所有的線程結束"); 

    } 

    

    static void Main(string[] args) 

    { 

        Thread thread1 = newThread(threadMethod); 

        Thread thread2 = newThread(threadMethod); 

        Thread thread3 = new Thread(threadMethod); 

    

         thread1.Start(3000); 

         thread2.Start(5000); 

         thread3.Start(7000); 

    

         Thread joinThread = newThread(joinAllThread); 

         joinThread.Start(new Thread[] {thread1, thread2, thread3 }); 

    

    } 

    

發佈了19 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章