.NET多線程編程(6)——如何操縱一個線程

  下面咱們就動手來建立個線程使用Thread類建立線程時只需提供線程入口便可(線程入口使知道該讓這個線程幹什麼事)   在C#中線程入口是經過ThreadStart代理(delegate)來提供你能夠把ThreadStart理解爲個指針指向線程要執行當Thread.Start思路方法後線程就開始執行ThreadStart所表明或者說指向   打開你VS.net新建個控制檯應用(Console Application)編寫徹底控制個線程代碼舉例: //ThreadTest.cs using; using.Threading; ThreadTest {   publicAlpha   {       publicvoidBeta       {         while(true)         {           Console.WriteLine("Alpha.Betaisrunninginitsownthread.");         }       }   };   publicSimple   {       publicMain       {         Console.WriteLine("ThreadStart/Stop/JoinSample");         AlphaoAlpha=Alpha;         file://這裏建立個線程使的執行Alpha類Beta思路方法         ThreadoThread=Thread(ThreadStart(oAlpha.Beta));         oThread.Start;         while(!oThread.IsAlive)            Thread.Sleep(1);         oThread.Abort;         oThread.Join;         Console.WriteLine;         Console.WriteLine("Alpha.Betahasfinished");         try         {           Console.WriteLine("TrytorestarttheAlpha.Betathread");           oThread.Start;         }         catch(ThreadStateException)         {           Console.Write("ThreadStateExceptiontryingtorestartAlpha.Beta.");           Console.WriteLine("Expectedsinceabortedthreadscannotberestarted.");           Console.ReadLine;         }         0;       }   } }   這段包含兩個類Alpha和Simple在建立線程oThread時咱們用指向Alpha.Beta思路方法化了 ThreadStart代理(delegate)對象當咱們建立線程oThreadoThread.Start思路方法啓動時實際上運行是 Alpha.Beta思路方法:   Alpha oAlpha = Alpha;   Thread oThread = Thread( ThreadStart(oAlpha.Beta));   oThread.Start;   而後在Mainwhile循環中咱們使用靜態思路方法Thread.Sleep讓主線程停了1ms這段時間CPU轉向執行線 程oThread而後咱們試圖用Thread.Abort思路方法終止線程oThread注意後面oThread.JoinThread.Join思路 方法使主線程等待直到oThread線程結束你能夠給Thread.Join思路方法指定個型參數做爲等待最長時間的後我 們試圖用Thread.Start思路方法從新啓動線程oThread可是顯然Abort思路方法帶來後果是不可恢復終止線程所 以最後會拋出ThreadStateException異常   主線程Main   全部線程都是依附於Main所在線程Main是C#入口起始線程能夠稱的爲主線程   若是全部前臺線程都中止了那麼主線程能夠終止而全部後臺線程都將無條件終止   全部線程雖然在微觀上是串行執行可是在宏觀上你徹底能夠認爲它們在並行執行   Thread.ThreadState 屬性   這個屬性表明了線程運行時狀態在區別狀況下有區別值咱們有時候能夠經過對該值判斷來設計流程   ThreadState 屬性取值以下:   Aborted:線程已中止;   AbortRequested:線程Thread.Abort思路方法已被可是線程還未中止;   Background:線程在後臺執行和屬性Thread.IsBackground有關;   Running:線程正在正常運行;   Stopped:線程已經被中止;   StopRequested:線程正在被要求中止;   Suspended:線程已經被掛起(此狀態下能夠經過Resume思路方法從新運行);   SuspendRequested:線程正在要求被掛起可是將來得及響應;   Unstarted:未Thread.Start開始線程運行;   WaitSleepJoin:線程了Wait,Sleep或Join等思路方法處於封鎖狀態;   上面提到了Background狀態表示該線程在後臺運行那麼後臺運行線程有什麼特別地方呢?其實後臺線程 跟前臺線程只有個區別那就是後臺線程不妨礙終止旦個進程全部前臺線程都終止後CLR(通用語言運行環境)將通 過任意個存活中後臺進程Abort思路方法來完全終止進程   線程優先級   當線程的間爭奪CPU時間時CPU 是按照線程優先級給予服務在C#應用中用戶能夠設定5個區別優先級由高 到低分別是HighestAboveNormalNormalBelowNormalLowest在建立線程時若是不指定優先級那麼系統默 認爲ThreadPriority.Normal   給個線程指定優先級咱們可使用以下代碼:   //設定優先級爲最低   myThread.Priority=ThreadPriority.Lowest;   經過設定線程優先級咱們能夠安排些相對重要線程優先執行例如對用戶響應等等
相關文章
相關標籤/搜索