C#多線程 ppt課件_第1頁
C#多線程 ppt課件_第2頁
C#多線程 ppt課件_第3頁
C#多線程 ppt課件_第4頁
C#多線程 ppt課件_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、C#多線程技術,主要內(nèi)容,1多線程概述 2thread類 3線程的生命周期 4線程的優(yōu)先級 5線程的同步 6多線程的自動管理,6.1 線程概述,進程:是應用程序的一個運行例程,是應用程序的一次動態(tài)執(zhí)行過程。 線程:是進程中的一個執(zhí)行單元;是操作系統(tǒng)分配CPU時間的基本單元。 Windows是一個支持多線程的系統(tǒng)。進程相當于一個容器,一個進程可以包含若干個線程。,多線程的概念,多線程:在同一時間執(zhí)行多個任務的功能,稱為多線程或自由線程。 多線程的優(yōu)點:提高CPU利用率。 主要缺點: 對資源的共享訪問可能造成沖突(對共享資源的訪問進行同步或控制) ;程序的整體運行速度減慢等等。 但從微觀上講,對單

2、CPU線程還是串行的。,多線程,程序 1,線程 1,線程 2,線程 3,單獨的執(zhí)行路徑,多線程,在以下情況中可能要使用到多線程:,程序需要同時執(zhí)行兩個或多個任務,程序要等待某事件的發(fā)生,例如用戶輸入、文件操作、網(wǎng)絡操作、搜索等,后臺程序,任何程序在執(zhí)行時,至少有一個主線程。主線程創(chuàng)建其他的附加線程。第一個線程總是Main()方法,因為第一個線程是由.NET運行庫開始執(zhí)行的,Main()方法是.NET運行庫選擇的第一個方法。,主線程,6.2 .NET對多線程的支持,在.NET程序設計中,線程是使用Thread類(或Timer類(線程計數(shù)器)、ThreadPool類(線程池)來處理的,這些類在Sy

3、stem.Threading命名空間中: Thread類:(實現(xiàn)線程的主要方法)一個Thread實例管理一個線程,即執(zhí)行序列。通過簡單實例化一個Thread對象,就可以創(chuàng)建一個線程,然后通過Thread對象提供的方法對線程進行管理。 Timer類:適用于間隔性的完成任務。 ThreadPool:適用于多個小的線程。,Thread類的主要屬性,1、CurrentThread:獲取當前正在運行的線程。 2、Name:獲取或設置線程的名稱。 3、Priority:獲取或設置線程的優(yōu)先級。 4、TreadState:獲取或設置線程的當前狀態(tài)。 5、IsBackground:指示線程是否為后臺線程。 6

4、、IsAlive:指示當前線程的執(zhí)行狀態(tài)。 7、CurrentContext:獲取線程其中執(zhí)行的當前上下文。,Thread類的主要方法,1、Start:啟動線程。 2、Suspend;掛起線程。 3、Resume:繼續(xù)已掛起的線程。 4、Interrupt:中斷處于WaitSleepJoin線程狀態(tài)的線程。 5、Join:阻塞調(diào)用線程,直到某個線程終止時為止。 6、Sleep:將當前線程阻塞指定的毫秒數(shù)。(休眠) 7、Abort:終止線程。 8、ResetAbort:取消為當前線程請求的Abort。,線程的建立與啟動,新建一個線程的過程:只需將其聲明并為其提供線程起始點處的方法委托,再用Thr

5、ead.Start()方法啟動該線程 (1)Thread a=new Thread(new ThreadStart(b); 其中,b為新建過程中執(zhí)行的過程名。 (2)調(diào)用Thread.Start()方法啟動該線程a.Start();,常用委托(了解),在System.Threading中,ThreadStart、ParameterizedThreadStart是最常用到的委托。 在C#中,線程入口是通過ThreadStart代理(delegate)來提供的,ThreadStart相當于一個函數(shù)指針,指向線程要執(zhí)行的函數(shù),當調(diào)用Thread.Start()方法后,線程就開始執(zhí)行ThreadSta

6、rt所代表或者說指向的函數(shù)。 由ThreadStart生成的線程是最直接的方式。 ParameterizedThreadStart是為異步觸發(fā)帶參數(shù)的方法而設的。,線程的休眠、掛起、恢復與終止,線程的休眠和掛起 (1)調(diào)用Thread.Sleep()方法將當前線程休眠指定的時間。 注:Sleep()方法指定的時間以毫秒為單位。 (2)調(diào)用s1.Suspend() 方法將線程掛起 區(qū)別:前者為靜態(tài)方法,并且使線程立即暫停一定時間;后者為實例方法,不會使線程立即停止執(zhí)行,直到線程到達安全點之后,它才將該線程暫停。 線程的恢復與終止 調(diào)用Resume()方法將線程恢復; 調(diào)用Abort()方法將線程

7、終止;,Join 、Interrupt,Join():使一個線程等待另一個線程停止(讓渡優(yōu)先權) 當前線程調(diào)用別的線程Join時,當前線程就會進入等待狀態(tài),等待調(diào)用線程完成所有操作后,當前線程才能繼續(xù)執(zhí)行(假設在A線程中調(diào)用了B.Join()那么就好像A對B說“B同志你趕快做,等你做完了我再繼續(xù)”)。 Interrupt():中斷處于JoinWait(?有木有)Sleep線程狀態(tài)的線程。(?如何繼續(xù)執(zhí)行),終止線程(Abort),若想終止正在運行的線程,可以使用Abort()方法。在使用Abort()的時候,將引發(fā)一個特殊異常 ThreadAbortException 。 若想在線程終止前恢復

8、線程的執(zhí)行,可以在捕獲異常后 ,在catch(ThreadAbortException ex). 中調(diào)用Thread.ResetAbort()取消終止。,線程的生命周期,線程的生命周期,前臺線程和后臺線程,Thread.Start()啟動的線程默認為前臺線程,應用程序域必須等待所有前臺線程運行結(jié)束后,才會自動卸載。 后臺線程: 將線程thread的IsBackground屬性,設置為true,把線程設置為后臺線程!這時應用程序域?qū)⒃谥骶€程完成時就被卸載,而不會等待異步線程的運行。,6.4 線程的優(yōu)先級,當線程之間爭奪CPU時間時,CPU按照是線程的優(yōu)先級給予服務的。高優(yōu)先級的線程可以完全阻止低

9、優(yōu)先級的線程執(zhí)行,因此在改變線程的優(yōu)先級時要小心。 每個線程在創(chuàng)建時其優(yōu)先級為: ThreadPriority.Normal 線程的優(yōu)先級定義為ThreadPriority枚舉類型,如下表:,6.5 線程的同步(異步),同步:是指在某一時刻只有一個線程可以訪問某共享數(shù)據(jù). 異步:多個線程同時訪問某個共享數(shù)據(jù),會造成數(shù)據(jù)混亂。 背景: 當多個線程共享數(shù)據(jù),其中一個或多個線程要修改數(shù)據(jù)時,有可能引起數(shù)據(jù)不統(tǒng)一等問題。,2、在C#中處理同步,通過對指定對象的加鎖和解鎖可以實現(xiàn)同步代碼段的訪問。 在.NET的System.Threading命名空間中提供了Monitor類來實現(xiàn)加鎖與解鎖。該類中的方法

10、都是靜態(tài)的。如下表:,Monitor(監(jiān)視器),Monitor.Enter(object)方法是獲取鎖,Monitor.Exit(object)方法是釋放鎖,為了避免在獲取鎖后發(fā)生異常,導致鎖無法釋放,所以要在finally塊中釋放鎖。 try Monitor.Enter(object); /do something finally Monitor.Exit(object); ,C#中 lock關鍵字提供了與Monitoy.Enter和Monitoy.Exit同樣的功能,這種方法用在你的代碼段不能被其他獨立的線程中斷的情況。通過對Monitor類的簡易封裝,lock為同步訪問變量提供了一個非常

11、簡單的方式,其用法如下: lock(this) / 要使用的語句 lock語句把變量放在圓括號中,以包裝對象,稱為獨占鎖或排它鎖。當執(zhí)行帶有l(wèi)ock關鍵字的復合語句時,獨占鎖會保留下來。當變量被包裝在獨占鎖中時,其他線程就不能訪問該變量。如果在上面的代碼中使用獨占鎖,在執(zhí)行復合語句時,這個線程就會失去其時間片。如果下一個獲得時間片的線程試圖訪問變量,就會被拒絕。Windows會讓其他線程處于睡眠狀態(tài),直到解除了獨占鎖為止。,lock 與Monitor 區(qū)別 lock 鎖定一段代碼,Monitor 鎖定一個對象。 Monitor 類可以鎖定一個對象,一個線程只有得到這把鎖才可以對該對象進行操作。

12、對象鎖機制保證了 在可能引起混亂的情況下一個時刻只有一個線程可以訪問這個對象。,3、同步時要注意的問題,線程同步會降低性能。原因有兩個: 一、在對象上放置和解開鎖會帶來某些系統(tǒng)開銷(較?。?二、線程同步使用得越多,等待釋放對象的線程就越多。如果一個線程在對象上放置了一個鎖,需要訪問該對象的其他線程就只能暫停執(zhí)行,直到該鎖被解開,才能繼續(xù)執(zhí)行。lock語句在某種意義上就是臨時禁用應用程序的多線程功能,也就臨時刪除了多線程的各種優(yōu)勢。,對于線程,系統(tǒng)在創(chuàng)建時不僅要給其分配資源,而且還要在線程之間互相切換、銷毀,這些都會造成程序性能降低。 線程池并不會在CLR初始化的時候立刻建立線程,而是在應用程序

13、要創(chuàng)建線程來執(zhí)行任務時,線程池才初始化一個線程。在完成任務以后,該線程不會自行銷毀,而是以掛起的狀態(tài)返回到線程池。直到應用程序再次向線程池發(fā)出請求時,線程池里掛起的線程就會再度激活執(zhí)行任務。這樣既節(jié)省了建立線程所造成的性能損耗,也可以讓多個任務反復重用同一線程,從而在應用程序生存期內(nèi)節(jié)約大量開銷。,多線程的自動管理:ThreadPool(線程池),6.6多線程的自動管理,下列情況下考慮線程池: 一: 應用程序中,線程把大部分的時間花費在等待狀態(tài),等待某個事件發(fā)生,然后才能給予響應,這一般使用 ThreadPool(線程池)來解決; 二:線程平時都處于休眠狀態(tài),只是周期性地被喚醒這一般使用 Ti

14、mer(定時器)來解決;,線程池中的線程默認為后臺線程,即它們的IsBackground 屬性為 true。這意味著在所有的前臺線程都已退出后,線程池線程會自動關閉。線程池通過線程命名空間的ThreadPool類來實現(xiàn),要請求由線程池中的一個線程來處理你的任務,需要調(diào)用QueueUserWorkItem方法。 代碼:ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadInvoke);,多線程的自動管理:ThreadPool(線程池),Timer 類: 設置一個定時器,定時執(zhí)行用戶指定的函數(shù)。定時器啟動后,系統(tǒng)將自動建立一個新的線程,執(zhí)行用戶指定的函數(shù)。 初始化: Timer timer = new Timer(timerDelegate, s,1000, 1000);,多線程的自動管理(定時器Timer),6.7 應用實例,(兩個關于線程或進程的例子) 綜合例題1:通過Process類獲

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論