C#多執行緒學習筆記

iDotNetSpace發表於2009-03-09

一、基本概念
     程式:當一個程式開始執行時,它就是一個程式,程式包括執行中的程式和程式所使用到的記憶體和系統資源。而一個程式又是由多個執行緒所組成的。
     執行緒:執行緒是程式中的一個執行流,每個執行緒都有自己的專有暫存器(棧指標、程式計數器等),但程式碼區是共享的,即不同的執行緒可以執行同樣的函式。
     多執行緒:多執行緒是指程式中包含多個執行流,即在一個程式中可以同時執行多個不同的執行緒來執行不同的任務,也就是說允許單個程式建立多個並行執行的執行緒來完成各自的任務。
     靜態屬性:這個類所有物件所公有的屬性,不管你建立了多少個這個類的例項,但是類的靜態屬性在記憶體中只有一個。

二、多執行緒的優劣
     優點:可以提高CPU的利用率。在多執行緒程式中,一個執行緒必須等待的時候,CPU可以執行其它的執行緒而不是等待,這樣就大大提高了程式的效率。
     缺點:執行緒也是程式,所以執行緒需要佔用記憶體,執行緒越多佔用記憶體也越多;
           多執行緒需要協調和管理,所以需要CPU時間跟蹤執行緒;
           執行緒之間對共享資源的訪問會相互影響,必須解決競用共享資源的問題;
           執行緒太多會導致控制太複雜,最終可能造成很多Bug;

三、控制執行緒的類和方法
     類:using System.Threading;  Thread類
     Thread類的方法:Start():啟動執行緒;
                     Sleep(int):靜態方法,暫停當前執行緒指定的毫秒數;
                     Abort():通常使用該方法來終止一個執行緒;
                     Suspend():該方法並不終止未完成的執行緒,它僅僅掛起執行緒,以後還可恢復;
                     Resume():恢復被Suspend()方法掛起的執行緒的執行。

四、如何操縱一個執行緒
     using System;
     using System.Threading;
     namespace ThreadTest
     {   
          public class Alpha
          {       
              public void Beta()   
              {       
                   while (true)           
                   {            
                       Console.WriteLine("Alpha.Beta is running in its own thread."); 
                   }    
              }  
          }
          public class Simple
          {  
              public static int Main()  
              {       
                   Console.WriteLine("Thread Start/Stop/Join Sample");
                   Alpha Alpha = new Alpha();   
                   //這裡建立一個執行緒,使之執行Alpha類的Beta()方法  
                   Thread Thread = new Thread(new ThreadStart(oAlpha.Beta));  
                   oThread.Start(); // 程式執行的是Alpha.Beta()方法
                   while (!oThread.IsAlive)    
                   Thread.Sleep(1);  //讓主執行緒停1ms       
                   oThread.Abort();  //終止執行緒oThread      
                   oThread.Join();  //使主執行緒等待,直到oThread執行緒結束。可以指定一個int型的引數作為等待的最長時間 
                   Console.WriteLine();     
                   Console.WriteLine("Alpha.Beta has finished");   
                   try           
                   {          
                       Console.WriteLine("Try to restart the Alpha.Beta thread");    
                       oThread.Start();          
                   }        
                   catch (ThreadStateException)       
                   {       
                       Console.Write("ThreadStateException trying to restart Alpha.Beta. ");
                       Console.WriteLine("Expected since aborted threads cannot be restarted.");                           Console.ReadLine();  
                   }        
                   return 0;  
              }  
           }
     }

五、Thread.ThreadState 屬性
     Aborted:執行緒已停止;
     AbortRequested:執行緒的Thread.Abort()方法已被呼叫,但是執行緒還未停止;
     Background:執行緒在後臺執行,與屬性Thread.IsBackground有關;不妨礙程式的終止
     Running:執行緒正在正常執行;
     Stopped:執行緒已經被停止;
     StopRequested:執行緒正在被要求停止;
     Suspended:執行緒已經被掛起(此狀態下,可以通過呼叫Resume()方法重新執行);
     SuspendRequested:執行緒正在要求被掛起,但是未來得及響應;
     Unstarted:未呼叫Thread.Start()開始執行緒的執行;
     WaitSleepJoin:執行緒因為呼叫了Wait(),Sleep()或Join()等方法處於封鎖狀態;

六、執行緒的優先順序
     由高到低分別是Highest,AboveNormal,Normal,BelowNormal,Lowest;系統預設為ThreadPriority.Normal
     指定優先順序的程式碼:myThread.Priority=ThreadPriority.Lowest;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-564900/,如需轉載,請註明出處,否則將追究法律責任。

相關文章