線程(Thread)、線程池(ThreadPool)技術

 

  線程:是Windows任務調度的最小單位。線程是程序中的一個執行流,每一個線程都有本身的專有寄存器(棧指針、程序計數器等),但代碼區是共享的,即不一樣的線程能夠執行一樣的函數,在一個應用程序中,經常須要使用多個線程來處理不一樣的事情,這樣能夠提升程序的運行效率,也不會使主界面出現無響應的狀況。在這裏主要介紹線程(Thread)、線程池(ThreadPool)兩種不一樣建立線程的區別編程

  在一般的狀況下,當咱們須要開啓一個新的線程時,咱們直接經過Thread(繼承自 System.Threading;)去建立一個新的線程,這樣作有一個好處就是咱們能夠拿到這個新建立的線程,而且能夠對這個線程去作一些相關的操做。可是經過建立一個新的線程會比較消耗資源,咱們都知道,操做系統的資源是有限的,當用戶訪問的多了,須要開啓的線程也跟着多了,當開啓的線程超過系統的最大線程數時,系統就容易出現崩潰。下面咱們來看一下建立100個線程所須要的時間異步

 for (int i = 0; i < 100; i++)//建立100個線程
            {
                new Thread(() =>
                    {
                        Console.WriteLine("建立線程的ID爲:"+Thread.CurrentThread.ManagedThreadId);

                    }).Start();
            }

            sw.Stop();
            Console.WriteLine("建立100個線程執行的時間爲:"+sw.ElapsedMilliseconds.ToString());

  運行後咱們發現建立100個線程的時間爲489ms,而且每一個線程都不一樣。當建立的線程數超過系統的最大線程數的話,那麼系統直接over了。有沒有解決的辦法呢,答案固然是有的,就是線程池(ThreadPool)技術。異步編程

  經過建立線程池對象,當須要使用線程時,就去池中看有沒有建立好的線程,有的話就直接將建立好的線程拿出來,線程池中沒有的話,就新建立一個線程,當線程使用完後,將放回線程池中供下次使用,這樣不只能夠減小建立線程消耗的時間以及消耗的內存,還可以提升線程的利用率。函數

 for (int i = 0; i < 100; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback((s) => {
                    Console.WriteLine("建立線程的ID爲:" + Thread.CurrentThread.ManagedThreadId);
                }));
            }

  從上面的運行結果咱們能夠發現,經過線程池去建立的線程,或者更準確點應該是去線程池獲取線程比建立線程所花的時間簡直是天差地別,線程的ID也是重複的,這也是經過線程池來獲取線程能夠提升線程的利用率。在這裏須要注意的一點是經過線程池獲取的線程都默認爲後臺線程ui

  最後,簡單的介紹一下Task工做任務項,Task爲.net4.0引入的新的使用線程池技術,微軟的MSDN上這樣介紹:Task 類的表示的單個操做不會返回一個值,一般以異步方式執行。 Task 對象是一種的中心思想 基於任務的異步編程模式 首次引入.NET Framework 4 中。spa

  在經過工廠開啓的新的線程池工做任務項,會直接執行,而經過本身建立的新飛工做任務項,須要本身手動去開啓執行操作系統

//使用工廠建立一個工做任務項,並執行了
Task t1 = Task.Factory.StartNew(() => { 
                //執行代碼
            });


//Task t1 = new Task(() =>
            //    {
            //        Thread.Sleep(2000);
            //        Console.WriteLine("當前的線程是:"+Thread.CurrentThread.ManagedThreadId);

            //    });
            //t1.Start();//須要手動啓動去執行

  總結:在實際的開發中,當不須要對線程進行操做的話,不要手動去建立線程,儘可能的使用線程池技術去建立開啓一個線程,能夠提升線程的使用效率,使用線程池技術也能夠提升應用程序的效率。.net

相關文章
相關標籤/搜索