




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C#多線程技術(shù),主要內(nèi)容,1多線程概述 2thread類 3線程的生命周期 4線程的優(yōu)先級(jí) 5線程的同步 6多線程的自動(dòng)管理,6.1 線程概述,進(jìn)程:是應(yīng)用程序的一個(gè)運(yùn)行例程,是應(yīng)用程序的一次動(dòng)態(tài)執(zhí)行過(guò)程。 線程:是進(jìn)程中的一個(gè)執(zhí)行單元;是操作系統(tǒng)分配CPU時(shí)間的基本單元。 Windows是一個(gè)支持多線程的系統(tǒng)。進(jìn)程相當(dāng)于一個(gè)容器,一個(gè)進(jìn)程可以包含若干個(gè)線程。,多線程的概念,多線程:在同一時(shí)間執(zhí)行多個(gè)任務(wù)的功能,稱為多線程或自由線程。 多線程的優(yōu)點(diǎn):提高CPU利用率。 主要缺點(diǎn): 對(duì)資源的共享訪問(wèn)可能造成沖突(對(duì)共享資源的訪問(wèn)進(jìn)行同步或控制) ;程序的整體運(yùn)行速度減慢等等。 但從微觀上講,對(duì)單
2、CPU線程還是串行的。,多線程,程序 1,線程 1,線程 2,線程 3,單獨(dú)的執(zhí)行路徑,多線程,在以下情況中可能要使用到多線程:,程序需要同時(shí)執(zhí)行兩個(gè)或多個(gè)任務(wù),程序要等待某事件的發(fā)生,例如用戶輸入、文件操作、網(wǎng)絡(luò)操作、搜索等,后臺(tái)程序,任何程序在執(zhí)行時(shí),至少有一個(gè)主線程。主線程創(chuàng)建其他的附加線程。第一個(gè)線程總是Main()方法,因?yàn)榈谝粋€(gè)線程是由.NET運(yùn)行庫(kù)開(kāi)始執(zhí)行的,Main()方法是.NET運(yùn)行庫(kù)選擇的第一個(gè)方法。,主線程,6.2 .NET對(duì)多線程的支持,在.NET程序設(shè)計(jì)中,線程是使用Thread類(或Timer類(線程計(jì)數(shù)器)、ThreadPool類(線程池)來(lái)處理的,這些類在Sy
3、stem.Threading命名空間中: Thread類:(實(shí)現(xiàn)線程的主要方法)一個(gè)Thread實(shí)例管理一個(gè)線程,即執(zhí)行序列。通過(guò)簡(jiǎn)單實(shí)例化一個(gè)Thread對(duì)象,就可以創(chuàng)建一個(gè)線程,然后通過(guò)Thread對(duì)象提供的方法對(duì)線程進(jìn)行管理。 Timer類:適用于間隔性的完成任務(wù)。 ThreadPool:適用于多個(gè)小的線程。,Thread類的主要屬性,1、CurrentThread:獲取當(dāng)前正在運(yùn)行的線程。 2、Name:獲取或設(shè)置線程的名稱。 3、Priority:獲取或設(shè)置線程的優(yōu)先級(jí)。 4、TreadState:獲取或設(shè)置線程的當(dāng)前狀態(tài)。 5、IsBackground:指示線程是否為后臺(tái)線程。 6
4、、IsAlive:指示當(dāng)前線程的執(zhí)行狀態(tài)。 7、CurrentContext:獲取線程其中執(zhí)行的當(dāng)前上下文。,Thread類的主要方法,1、Start:?jiǎn)?dòng)線程。 2、Suspend;掛起線程。 3、Resume:繼續(xù)已掛起的線程。 4、Interrupt:中斷處于WaitSleepJoin線程狀態(tài)的線程。 5、Join:阻塞調(diào)用線程,直到某個(gè)線程終止時(shí)為止。 6、Sleep:將當(dāng)前線程阻塞指定的毫秒數(shù)。(休眠) 7、Abort:終止線程。 8、ResetAbort:取消為當(dāng)前線程請(qǐng)求的Abort。,線程的建立與啟動(dòng),新建一個(gè)線程的過(guò)程:只需將其聲明并為其提供線程起始點(diǎn)處的方法委托,再用Thr
5、ead.Start()方法啟動(dòng)該線程 (1)Thread a=new Thread(new ThreadStart(b); 其中,b為新建過(guò)程中執(zhí)行的過(guò)程名。 (2)調(diào)用Thread.Start()方法啟動(dòng)該線程a.Start();,常用委托(了解),在System.Threading中,ThreadStart、ParameterizedThreadStart是最常用到的委托。 在C#中,線程入口是通過(guò)ThreadStart代理(delegate)來(lái)提供的,ThreadStart相當(dāng)于一個(gè)函數(shù)指針,指向線程要執(zhí)行的函數(shù),當(dāng)調(diào)用Thread.Start()方法后,線程就開(kāi)始執(zhí)行ThreadSta
6、rt所代表或者說(shuō)指向的函數(shù)。 由ThreadStart生成的線程是最直接的方式。 ParameterizedThreadStart是為異步觸發(fā)帶參數(shù)的方法而設(shè)的。,線程的休眠、掛起、恢復(fù)與終止,線程的休眠和掛起 (1)調(diào)用Thread.Sleep()方法將當(dāng)前線程休眠指定的時(shí)間。 注:Sleep()方法指定的時(shí)間以毫秒為單位。 (2)調(diào)用s1.Suspend() 方法將線程掛起 區(qū)別:前者為靜態(tài)方法,并且使線程立即暫停一定時(shí)間;后者為實(shí)例方法,不會(huì)使線程立即停止執(zhí)行,直到線程到達(dá)安全點(diǎn)之后,它才將該線程暫停。 線程的恢復(fù)與終止 調(diào)用Resume()方法將線程恢復(fù); 調(diào)用Abort()方法將線程
7、終止;,Join 、Interrupt,Join():使一個(gè)線程等待另一個(gè)線程停止(讓渡優(yōu)先權(quán)) 當(dāng)前線程調(diào)用別的線程Join時(shí),當(dāng)前線程就會(huì)進(jìn)入等待狀態(tài),等待調(diào)用線程完成所有操作后,當(dāng)前線程才能繼續(xù)執(zhí)行(假設(shè)在A線程中調(diào)用了B.Join()那么就好像A對(duì)B說(shuō)“B同志你趕快做,等你做完了我再繼續(xù)”)。 Interrupt():中斷處于JoinWait(?有木有)Sleep線程狀態(tài)的線程。(?如何繼續(xù)執(zhí)行),終止線程(Abort),若想終止正在運(yùn)行的線程,可以使用Abort()方法。在使用Abort()的時(shí)候,將引發(fā)一個(gè)特殊異常 ThreadAbortException 。 若想在線程終止前恢復(fù)
8、線程的執(zhí)行,可以在捕獲異常后 ,在catch(ThreadAbortException ex). 中調(diào)用Thread.ResetAbort()取消終止。,線程的生命周期,線程的生命周期,前臺(tái)線程和后臺(tái)線程,Thread.Start()啟動(dòng)的線程默認(rèn)為前臺(tái)線程,應(yīng)用程序域必須等待所有前臺(tái)線程運(yùn)行結(jié)束后,才會(huì)自動(dòng)卸載。 后臺(tái)線程: 將線程thread的IsBackground屬性,設(shè)置為true,把線程設(shè)置為后臺(tái)線程!這時(shí)應(yīng)用程序域?qū)⒃谥骶€程完成時(shí)就被卸載,而不會(huì)等待異步線程的運(yùn)行。,6.4 線程的優(yōu)先級(jí),當(dāng)線程之間爭(zhēng)奪CPU時(shí)間時(shí),CPU按照是線程的優(yōu)先級(jí)給予服務(wù)的。高優(yōu)先級(jí)的線程可以完全阻止低
9、優(yōu)先級(jí)的線程執(zhí)行,因此在改變線程的優(yōu)先級(jí)時(shí)要小心。 每個(gè)線程在創(chuàng)建時(shí)其優(yōu)先級(jí)為: ThreadPriority.Normal 線程的優(yōu)先級(jí)定義為ThreadPriority枚舉類型,如下表:,6.5 線程的同步(異步),同步:是指在某一時(shí)刻只有一個(gè)線程可以訪問(wèn)某共享數(shù)據(jù). 異步:多個(gè)線程同時(shí)訪問(wèn)某個(gè)共享數(shù)據(jù),會(huì)造成數(shù)據(jù)混亂。 背景: 當(dāng)多個(gè)線程共享數(shù)據(jù),其中一個(gè)或多個(gè)線程要修改數(shù)據(jù)時(shí),有可能引起數(shù)據(jù)不統(tǒng)一等問(wèn)題。,2、在C#中處理同步,通過(guò)對(duì)指定對(duì)象的加鎖和解鎖可以實(shí)現(xiàn)同步代碼段的訪問(wèn)。 在.NET的System.Threading命名空間中提供了Monitor類來(lái)實(shí)現(xiàn)加鎖與解鎖。該類中的方法
10、都是靜態(tài)的。如下表:,Monitor(監(jiān)視器),Monitor.Enter(object)方法是獲取鎖,Monitor.Exit(object)方法是釋放鎖,為了避免在獲取鎖后發(fā)生異常,導(dǎo)致鎖無(wú)法釋放,所以要在finally塊中釋放鎖。 try Monitor.Enter(object); /do something finally Monitor.Exit(object); ,C#中 lock關(guān)鍵字提供了與Monitoy.Enter和Monitoy.Exit同樣的功能,這種方法用在你的代碼段不能被其他獨(dú)立的線程中斷的情況。通過(guò)對(duì)Monitor類的簡(jiǎn)易封裝,lock為同步訪問(wèn)變量提供了一個(gè)非常
11、簡(jiǎn)單的方式,其用法如下: lock(this) / 要使用的語(yǔ)句 lock語(yǔ)句把變量放在圓括號(hào)中,以包裝對(duì)象,稱為獨(dú)占鎖或排它鎖。當(dāng)執(zhí)行帶有l(wèi)ock關(guān)鍵字的復(fù)合語(yǔ)句時(shí),獨(dú)占鎖會(huì)保留下來(lái)。當(dāng)變量被包裝在獨(dú)占鎖中時(shí),其他線程就不能訪問(wèn)該變量。如果在上面的代碼中使用獨(dú)占鎖,在執(zhí)行復(fù)合語(yǔ)句時(shí),這個(gè)線程就會(huì)失去其時(shí)間片。如果下一個(gè)獲得時(shí)間片的線程試圖訪問(wèn)變量,就會(huì)被拒絕。Windows會(huì)讓其他線程處于睡眠狀態(tài),直到解除了獨(dú)占鎖為止。,lock 與Monitor 區(qū)別 lock 鎖定一段代碼,Monitor 鎖定一個(gè)對(duì)象。 Monitor 類可以鎖定一個(gè)對(duì)象,一個(gè)線程只有得到這把鎖才可以對(duì)該對(duì)象進(jìn)行操作。
12、對(duì)象鎖機(jī)制保證了 在可能引起混亂的情況下一個(gè)時(shí)刻只有一個(gè)線程可以訪問(wèn)這個(gè)對(duì)象。,3、同步時(shí)要注意的問(wèn)題,線程同步會(huì)降低性能。原因有兩個(gè): 一、在對(duì)象上放置和解開(kāi)鎖會(huì)帶來(lái)某些系統(tǒng)開(kāi)銷(較小) 二、線程同步使用得越多,等待釋放對(duì)象的線程就越多。如果一個(gè)線程在對(duì)象上放置了一個(gè)鎖,需要訪問(wèn)該對(duì)象的其他線程就只能暫停執(zhí)行,直到該鎖被解開(kāi),才能繼續(xù)執(zhí)行。lock語(yǔ)句在某種意義上就是臨時(shí)禁用應(yīng)用程序的多線程功能,也就臨時(shí)刪除了多線程的各種優(yōu)勢(shì)。,對(duì)于線程,系統(tǒng)在創(chuàng)建時(shí)不僅要給其分配資源,而且還要在線程之間互相切換、銷毀,這些都會(huì)造成程序性能降低。 線程池并不會(huì)在CLR初始化的時(shí)候立刻建立線程,而是在應(yīng)用程序
13、要?jiǎng)?chuàng)建線程來(lái)執(zhí)行任務(wù)時(shí),線程池才初始化一個(gè)線程。在完成任務(wù)以后,該線程不會(huì)自行銷毀,而是以掛起的狀態(tài)返回到線程池。直到應(yīng)用程序再次向線程池發(fā)出請(qǐng)求時(shí),線程池里掛起的線程就會(huì)再度激活執(zhí)行任務(wù)。這樣既節(jié)省了建立線程所造成的性能損耗,也可以讓多個(gè)任務(wù)反復(fù)重用同一線程,從而在應(yīng)用程序生存期內(nèi)節(jié)約大量開(kāi)銷。,多線程的自動(dòng)管理:ThreadPool(線程池),6.6多線程的自動(dòng)管理,下列情況下考慮線程池: 一: 應(yīng)用程序中,線程把大部分的時(shí)間花費(fèi)在等待狀態(tài),等待某個(gè)事件發(fā)生,然后才能給予響應(yīng),這一般使用 ThreadPool(線程池)來(lái)解決; 二:線程平時(shí)都處于休眠狀態(tài),只是周期性地被喚醒這一般使用 Ti
14、mer(定時(shí)器)來(lái)解決;,線程池中的線程默認(rèn)為后臺(tái)線程,即它們的IsBackground 屬性為 true。這意味著在所有的前臺(tái)線程都已退出后,線程池線程會(huì)自動(dòng)關(guān)閉。線程池通過(guò)線程命名空間的ThreadPool類來(lái)實(shí)現(xiàn),要請(qǐng)求由線程池中的一個(gè)線程來(lái)處理你的任務(wù),需要調(diào)用QueueUserWorkItem方法。 代碼:ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadInvoke);,多線程的自動(dòng)管理:ThreadPool(線程池),Timer 類: 設(shè)置一個(gè)定時(shí)器,定時(shí)執(zhí)行用戶指定的函數(shù)。定時(shí)器啟動(dòng)后,系統(tǒng)將自動(dòng)建立一個(gè)新的線程,執(zhí)行用戶指定的函數(shù)。 初始化: Timer timer = new Timer(timerDelegate, s,1000, 1000);,多線程的自動(dòng)管理(定時(shí)器Timer),6.7 應(yīng)用實(shí)例,(兩個(gè)關(guān)于線程或進(jìn)程的例子) 綜合例題1:通過(guò)Process類獲
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 智慧辦公解決方案技術(shù)框架與效果評(píng)估
- 數(shù)字化教育的商業(yè)前景與市場(chǎng)機(jī)遇分析
- 教育政策東西方理念的碰撞與融合
- 基于人工智能的教育機(jī)器人商業(yè)價(jià)值探索
- 抖音商戶直播分享按鈕優(yōu)化制度
- 江西省廣豐縣聯(lián)考2024年化學(xué)九年級(jí)第一學(xué)期期末統(tǒng)考模擬試題含解析
- 貴州省仁懷市2024年化學(xué)九年級(jí)第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)模擬試題含解析
- 蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院《地理專業(yè)英語(yǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年湖北省武漢武昌區(qū)四校聯(lián)考化學(xué)九年級(jí)第一學(xué)期期末達(dá)標(biāo)測(cè)試試題含解析
- 2025屆潮安龍湖中學(xué)九上化學(xué)期末達(dá)標(biāo)檢測(cè)試題含解析
- 商丘市寧陵縣2025年五年級(jí)數(shù)學(xué)第二學(xué)期期末達(dá)標(biāo)檢測(cè)試題含答案
- 2025年江蘇省徐州中考練習(xí)卷(1)英語(yǔ)試題(含答案)
- 公司加農(nóng)戶種植協(xié)議書范本
- 2025年離婚協(xié)議書模板一個(gè)小孩
- 輕鋼結(jié)構(gòu)屋面施工方案
- 2025年中智科技集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 個(gè)體戶庭審委托書
- 會(huì)計(jì)師事務(wù)所績(jī)效考核方案
- 健身教練獨(dú)立承包協(xié)議(2024年版)
- 洗衣機(jī)設(shè)備保修條款
- 日語(yǔ)被動(dòng)態(tài)練習(xí)
評(píng)論
0/150
提交評(píng)論