版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1-基于C#語(yǔ)言本課學(xué)時(shí):72課時(shí)聯(lián)系方式:Windows程序設(shè)計(jì)2第五章、多線(xiàn)程編程技術(shù)n本章主要內(nèi)容介紹5.1 計(jì)算機(jī)線(xiàn)程介紹5.2 System.Threading簡(jiǎn)介5.3 線(xiàn)程的優(yōu)先級(jí)與鎖技術(shù)CONTENT3本章學(xué)習(xí)目標(biāo):本章學(xué)習(xí)目標(biāo): 理解線(xiàn)程的概念 理解.NET中線(xiàn)程的屬性和方法 創(chuàng)建和使用線(xiàn)程 理解線(xiàn)程的特點(diǎn)、優(yōu)點(diǎn)及使用場(chǎng)合4同時(shí)執(zhí)行所有任務(wù),時(shí)間更少,效率更高 人 體5.1 線(xiàn)程簡(jiǎn)介讀 ,寫(xiě)一覽無(wú)遺血液循環(huán)在同一時(shí)間點(diǎn)執(zhí)行各項(xiàng)進(jìn)程 編譯程序 發(fā)送/接收郵件 打印文件 其他操作系統(tǒng)允許計(jì)算機(jī)同時(shí)執(zhí)行多項(xiàng)操作程序(進(jìn)程)55.1 線(xiàn)程簡(jiǎn)介程序 1 程序 2線(xiàn)程 1線(xiàn)程 2線(xiàn)程 3
2、線(xiàn)程 1線(xiàn)程 2線(xiàn)程 3單獨(dú)的執(zhí)行路徑65.1 線(xiàn)程簡(jiǎn)介 進(jìn)程:進(jìn)程:是應(yīng)用程序的一個(gè)運(yùn)行例程,是應(yīng)用程序的一次動(dòng)態(tài)執(zhí)行過(guò)程。 線(xiàn)程:線(xiàn)程:是進(jìn)程中的一個(gè)執(zhí)行單元;是操作系統(tǒng)分配CPU時(shí)間的基本單元。n Windows是一個(gè)支持多線(xiàn)程的系統(tǒng)。n 一個(gè)進(jìn)程可以包含若干個(gè)線(xiàn)程。75.1 線(xiàn)程簡(jiǎn)介在以下情況中可能要使用到多線(xiàn)程: l程序需要同時(shí)執(zhí)行兩個(gè)或多個(gè)任務(wù)l程序要等待某事件的發(fā)生,例如用戶(hù)輸入、文件操作、網(wǎng)絡(luò)操作、搜索等l后臺(tái)程序85.1 線(xiàn)程簡(jiǎn)介 多線(xiàn)程:多線(xiàn)程:在同一時(shí)間執(zhí)行多個(gè)任務(wù)的功能,稱(chēng)為多線(xiàn)程或自由線(xiàn)程。 多線(xiàn)程的優(yōu)點(diǎn):多線(xiàn)程的優(yōu)點(diǎn):可以同時(shí)完成多個(gè)任務(wù);可以使程序的響應(yīng)速度更快;
3、可以讓占用大量處理時(shí)間的任務(wù)或當(dāng)前沒(méi)有進(jìn)行處理的任務(wù)定期將處理時(shí)間讓給別的任務(wù);可以隨時(shí)停止任務(wù);可以設(shè)置每個(gè)任務(wù)的優(yōu)先級(jí)以?xún)?yōu)化程序性能。 多線(xiàn)程的缺點(diǎn):多線(xiàn)程的缺點(diǎn): 對(duì)資源的共享訪問(wèn)可能造成沖突(對(duì)共享資源的訪問(wèn)進(jìn)行同步或控制) ;程序的整體運(yùn)行速度減慢等等。在C#應(yīng)用程序中,第一個(gè)線(xiàn)程總是Main()方法,因?yàn)榈谝粋€(gè)線(xiàn)程是由.NET運(yùn)行庫(kù)開(kāi)始執(zhí)行的,Main()方法是.NET運(yùn)行庫(kù)選擇的第一個(gè)方法。后續(xù)的線(xiàn)程由應(yīng)用程序在內(nèi)部啟動(dòng),即應(yīng)用程序可以創(chuàng)建和啟動(dòng)新的線(xiàn)程。95.2 System.Threading 命名空間105.2 System.Threading 命名空間 在.NET程序設(shè)計(jì)
4、中,線(xiàn)程是使用Thread類(lèi)(或Timer類(lèi)(線(xiàn)程計(jì)數(shù)器)、ThreadPool類(lèi)(線(xiàn)程池)來(lái)處理的,這些類(lèi)在System.Threading命名空間中: using System.Threading; Thread類(lèi):類(lèi):(實(shí)現(xiàn)線(xiàn)程的主要方法)一個(gè)Thread實(shí)例管理一個(gè)線(xiàn)程,即執(zhí)行序列。通過(guò)簡(jiǎn)單實(shí)例化一個(gè)Thread對(duì)象,就可以創(chuàng)建一個(gè)線(xiàn)程,然后通過(guò)Thread對(duì)象提供的方法對(duì)線(xiàn)程進(jìn)行管理。 Timer類(lèi):類(lèi):適用于間隔性的完成任務(wù)。 ThreadPool類(lèi):類(lèi):適用于多個(gè)小的線(xiàn)程。111、Thread 類(lèi)的屬性和方法引用System.Threading 命名空間Thread 線(xiàn)程實(shí)例名
5、= new Thread(new ThreadStart(方法名);運(yùn)行在線(xiàn)程上的方法只創(chuàng)建但不啟動(dòng)線(xiàn)程只創(chuàng)建但不啟動(dòng)線(xiàn)程線(xiàn)程實(shí)例名.Start();121、Thread 類(lèi)的屬性和方法屬性屬性CurrentThread獲取當(dāng)前正在運(yùn)行的線(xiàn)程IsAlive指示當(dāng)前線(xiàn)程的執(zhí)行狀態(tài)Name獲取或設(shè)置線(xiàn)程的名稱(chēng)Priority獲取或設(shè)置線(xiàn)程的優(yōu)先級(jí)CurrentContext獲取線(xiàn)程其中執(zhí)行的當(dāng)前上下文IsBackground指示線(xiàn)程是否為后臺(tái)線(xiàn)程ThreadState獲取或設(shè)置線(xiàn)程的當(dāng)前狀態(tài)方法方法Sleep()將當(dāng)前線(xiàn)程阻塞指定的毫秒數(shù)Abort()終止線(xiàn)程Join()阻塞調(diào)用線(xiàn)程,直到某個(gè)線(xiàn)程
6、終止時(shí)為止Resume()繼續(xù)已掛起的線(xiàn)程Start() 啟動(dòng)線(xiàn)程Suspend()掛起線(xiàn)程GetDomain返回當(dāng)前線(xiàn)程正在其中運(yùn)行的當(dāng)前域Interrupt中斷處于WaitSleepJoin線(xiàn)程狀態(tài)的線(xiàn)程ResetAbort取消為當(dāng)前線(xiàn)程請(qǐng)求的Abort132、線(xiàn)程的生命周期在 I/O 操作期間線(xiàn)程被阻止線(xiàn)程已創(chuàng)建但并未啟動(dòng)線(xiàn)程已啟動(dòng)I/O 操作完成后運(yùn)行線(xiàn)程被阻止,另一個(gè)操作正在進(jìn)行提前中斷或特地停止線(xiàn)程暫時(shí)中斷的線(xiàn)程 線(xiàn)程已恢復(fù)等待等待 / / 休眠休眠 / / 加入加入已暫停已暫停正在運(yùn)行正在運(yùn)行已停止已停止未開(kāi)始未開(kāi)始已開(kāi)始已開(kāi)始已阻止已阻止暫停暫停發(fā)送發(fā)送 I/O 請(qǐng)求請(qǐng)求等待等
7、待, 休眠休眠, 加入加入開(kāi)始開(kāi)始I/O 完成完成完成完成恢復(fù)恢復(fù)145.3 線(xiàn)程的建立與啟動(dòng)新建一個(gè)線(xiàn)程的過(guò)程:只需將其聲明并為其提供線(xiàn)程起始點(diǎn)處的方法委托,再用Thread.Start()方法啟動(dòng)該線(xiàn)程(1)聲明:Thread a;(2)實(shí)例化a=new Thread(new ThreadStart(b);其中,b為新建過(guò)程中執(zhí)行的過(guò)程名。(3)調(diào)用Thread.Start()方法啟動(dòng)該線(xiàn)程a.Start();155.3 線(xiàn)程的建立與啟動(dòng)using System;using System.Threading;public class A public void ff()/線(xiàn)程啟動(dòng)時(shí)調(diào)用此方
8、法Console.WriteLine(A.ff()方法在另一個(gè)線(xiàn)程上運(yùn)行!);Thread.Sleep(3000);/將線(xiàn)程阻塞一定時(shí)間Console.WriteLine(終止工作線(xiàn)程調(diào)用此實(shí)例方法!);public static void gg()Console.WriteLine(A.gg()方法在另一個(gè)線(xiàn)程上運(yùn)行!);Thread.Sleep(5000);/將線(xiàn)程阻塞一定時(shí)間Console.WriteLine(終止工作線(xiàn)程調(diào)用此靜態(tài)方法!);例題1:線(xiàn)程的建立和啟動(dòng)165.3 線(xiàn)程的建立與啟動(dòng)public class Bpublic static void Main()Console.W
9、riteLine(*線(xiàn)程簡(jiǎn)單示例!*);A a=new A();Thread s1=new Thread(new ThreadStart(a.ff);s1.Start();Console.WriteLine(啟動(dòng)新線(xiàn)程ff()方法后,被Main()線(xiàn)程調(diào)用!);Thread s2=new Thread(new ThreadStart(A.gg);s2.Start();Console.WriteLine(啟動(dòng)新線(xiàn)程gg()方法后,被Main()線(xiàn)程調(diào)用!);Console.ReadLine();例題1:線(xiàn)程的建立和啟動(dòng)175.3 線(xiàn)程的建立與啟動(dòng)線(xiàn)程的掛起(或暫停)線(xiàn)程的掛起(或暫停)(1)調(diào)用
10、Thread.Sleep()方法將線(xiàn)程掛起。注:Sleep()方法指定的時(shí)間以毫秒為單位。(2)調(diào)用s1.Suspend() 方法將線(xiàn)程掛起區(qū)別:前者為靜態(tài)方法,并且使線(xiàn)程立即暫停一定時(shí)間;后者為實(shí)例方法,不會(huì)使線(xiàn)程立即停止執(zhí)行,直到線(xiàn)程到達(dá)安全點(diǎn)之后,它才將該線(xiàn)程暫停。線(xiàn)程的恢復(fù)與終止線(xiàn)程的恢復(fù)與終止調(diào)用Resume()方法將線(xiàn)程恢復(fù);調(diào)用Abort()方法將線(xiàn)程終止;線(xiàn)程的掛起、恢復(fù)與終止其他與操作線(xiàn)程相關(guān)的方法Join():使一個(gè)線(xiàn)程等待另一個(gè)線(xiàn)程停止Interrupt():中斷處于JoinWaitSleep線(xiàn)程狀態(tài)的線(xiàn)程。185.4 線(xiàn)程的優(yōu)先級(jí)class SimpleThreadDe
11、mo static void Main(string args) Thread.CurrentThread.Name = “主線(xiàn)程;Thread objThread = new Thread(new ThreadStart(ActionMethod);objThread.Name = “子線(xiàn)程; /啟動(dòng)子線(xiàn)程, 并為該線(xiàn)程執(zhí)行 ActionMethodobjThread.Start();/這將為主線(xiàn)程執(zhí)行 ActionMethodActionMethod(); static void ActionMethod() for(int count = 1; count =4990; index-)
12、Console.WriteLine(index); static void Main(string args)Thread objThreadOne = new Thread(new ThreadStart(TaskOne);Thread objThreadTwo = new Thread(new ThreadStart(TaskTwo);objThreadOne.Start();objThreadTwo.Start();static void TaskOne() for(int count=1;count=5;count+) Console.WriteLine(count*2); 無(wú)優(yōu)先級(jí)線(xiàn)
13、程,同時(shí)執(zhí)行,輸出無(wú)序.21例題1:static void Main(string args) Thread.CurrentThread.Name = “主線(xiàn)程; Thread objThreadOne = new Thread(new ThreadStart(TaskOne); objThreadOne.Name = “子線(xiàn)程 1; Thread objThreadTwo = new Thread(new ThreadStart(TaskTwo); objThreadTwo.Name = “子線(xiàn)程 2; / 這將啟動(dòng)子線(xiàn)程 objThreadOne.Start(); objThreadTwo
14、.Start(); objThreadTwo.Priority = ThreadPriority.Highest;將在執(zhí)行第一個(gè)線(xiàn)程前執(zhí)行 objThreadTwo5.4 線(xiàn)程的優(yōu)先級(jí)225.4 線(xiàn)程的優(yōu)先級(jí)【代碼見(jiàn)下:】問(wèn)題:請(qǐng)將代碼執(zhí)行多次,觀察每次執(zhí)行順序的不同之處。為什么代碼執(zhí)行是完全不同呢?【結(jié)論:】如果不將線(xiàn)程按照一定的順序運(yùn)行,則線(xiàn)程代碼在處理上將會(huì)混亂不堪。例題2:使用三個(gè)線(xiàn)程顯示計(jì)數(shù)235.4 線(xiàn)程的優(yōu)先級(jí)【線(xiàn)程優(yōu)先級(jí)小結(jié):】 如果自行提高一個(gè)線(xiàn)程的優(yōu)先級(jí),那么該線(xiàn)程就會(huì)相應(yīng)相應(yīng)的獲得更多的的獲得更多的CPU時(shí)間時(shí)間;通過(guò)降低了線(xiàn)程的優(yōu)先級(jí),該線(xiàn)程就會(huì)被分配到比原來(lái)少的被分配
15、到比原來(lái)少的CPU時(shí)間了時(shí)間了。 你可以在一個(gè)線(xiàn)程開(kāi)始運(yùn)行前或是在它的運(yùn)行過(guò)程中的任何時(shí)候改變它的優(yōu)先級(jí)。理論上你還可以任意的設(shè)置每個(gè)線(xiàn)程的優(yōu)先級(jí),不過(guò)一個(gè)優(yōu)先級(jí)過(guò)高的線(xiàn)程往往會(huì)影響不過(guò)一個(gè)優(yōu)先級(jí)過(guò)高的線(xiàn)程往往會(huì)影響到其他線(xiàn)程的運(yùn)行,甚至影響到其他程序的運(yùn)行,所以最到其他線(xiàn)程的運(yùn)行,甚至影響到其他程序的運(yùn)行,所以最好不要隨意的設(shè)置線(xiàn)程的優(yōu)先級(jí)。好不要隨意的設(shè)置線(xiàn)程的優(yōu)先級(jí)。 例題1:使用三個(gè)線(xiàn)程顯示計(jì)數(shù)【代碼更改】245.5 線(xiàn)程的同步使用線(xiàn)程的一個(gè)重要方面是同步訪問(wèn)多個(gè)線(xiàn)程訪問(wèn)的任何變量同步訪問(wèn)多個(gè)線(xiàn)程訪問(wèn)的任何變量。n 背景:背景:當(dāng)多個(gè)線(xiàn)程共享數(shù)據(jù),其中一個(gè)或多個(gè)線(xiàn)程要修改數(shù)據(jù)時(shí),有可能
16、引起數(shù)據(jù)不統(tǒng)一等問(wèn)題。n 同步:同步:是指在某一時(shí)刻只有一個(gè)線(xiàn)程可以訪問(wèn)某共享數(shù)據(jù)。1、同步的含義、同步的含義 同步問(wèn)題的產(chǎn)生,主要是由于在高級(jí)語(yǔ)言的源代碼中,大多數(shù)情況下看起來(lái)是一條語(yǔ)句,但在最后編譯好的匯編語(yǔ)言機(jī)器碼中則會(huì)被翻譯為許多條語(yǔ)句,從而在操作系統(tǒng)調(diào)度時(shí)被劃分到不同的時(shí)間片中。例如255.5 線(xiàn)程的同步例如:message += Hello world!;這條語(yǔ)句在C#語(yǔ)法上是一條語(yǔ)句,但在執(zhí)行代碼時(shí),實(shí)際上它涉及到許多操作。需要重新分配內(nèi)存以存儲(chǔ)更長(zhǎng)的新字符串,需要設(shè)置變量message使之指向新的內(nèi)存,需要復(fù)制實(shí)際文本等。265.5 線(xiàn)程的同步 通過(guò)對(duì)指定對(duì)象的加鎖和解鎖可以實(shí)
17、現(xiàn)同步代碼段的訪問(wèn)。在.NET的System.Threading命名空間中提供了Monitor類(lèi)類(lèi)來(lái)實(shí)現(xiàn)加鎖與解鎖加鎖與解鎖。該類(lèi)中的方法都是靜態(tài)的。如下表:1、在、在C#中處理同步中處理同步27鎖定機(jī)制程序線(xiàn)程1 1線(xiàn)程2 2共享資源 鎖定機(jī)制保證每次只有一個(gè)線(xiàn)程可以訪問(wèn)共享資源緩沖和隔離28示例class ThreadLockDemostatic void Main()Thread.CurrentThread.Name = “主線(xiàn)程;ThreadLockDemo objDemo = new ThreadLockDemo();Thread newThread = new Thread(new
18、 ThreadStart(objDemo.DoTask);newThread.Name = “子線(xiàn)程;newThread.Start();objDemo.DoTask();void DoTask()lock(this)for(int count = 1; count = 10 ; count+)Console.WriteLine(“線(xiàn)程名: + Thread.CurrentThread.Name);實(shí)例化 newThread 線(xiàn)程并開(kāi)始執(zhí)行 DoTask() 鎖定當(dāng)前實(shí)例 objDemo,在塊中完成執(zhí)行,然后釋放對(duì)象295.5 線(xiàn)程的同步 C#中 lock關(guān)鍵字關(guān)鍵字提供了與Monitoy.Enter和和Monitoy.Exit同樣的功能,這種方法用在你的代碼段不能被其他獨(dú)立的線(xiàn)程中斷的情況。通過(guò)對(duì)Monitor類(lèi)的簡(jiǎn)易封裝,lock為同步訪問(wèn)變量提供了一個(gè)非常簡(jiǎn)單的方式,其用法如下:lock(x) / 使用x的語(yǔ)句1、在、在C#中處理同步中處理同步 lock語(yǔ)句把變量放在圓括號(hào)中,以包裝對(duì)象,稱(chēng)為獨(dú)占鎖獨(dú)占鎖或排它鎖排它鎖。當(dāng)執(zhí)行帶有l(wèi)ock關(guān)鍵字的復(fù)合語(yǔ)句時(shí),獨(dú)占鎖會(huì)保留下來(lái)。當(dāng)變量被包裝在獨(dú)占鎖中時(shí),其他線(xiàn)程就不能訪問(wèn)該變量。如果在上面的代碼中使用獨(dú)占鎖,在執(zhí)行復(fù)合語(yǔ)句時(shí),這個(gè)線(xiàn)程就會(huì)失去其時(shí)間片。如果下一個(gè)獲得時(shí)間片的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 某公司員工培訓(xùn)
- 2024-2025學(xué)年江西省“三新”協(xié)同教研共同體高二下學(xué)期5月聯(lián)考?xì)v史試題(解析版)
- 2026年網(wǎng)絡(luò)信息安全知識(shí)與應(yīng)對(duì)能力考查題集
- 2026年語(yǔ)言學(xué)習(xí)考試漢語(yǔ)言文化基礎(chǔ)試題
- 2026年汽車(chē)制造汽車(chē)工程師招聘面試題集與汽車(chē)工藝知識(shí)問(wèn)答
- 2026年計(jì)算機(jī)網(wǎng)絡(luò)安全防護(hù)措施考試題
- 2026年金融科技產(chǎn)品創(chuàng)新與市場(chǎng)需求分析題庫(kù)
- 2026年公共關(guān)系與危機(jī)處理能力測(cè)試題目
- 2026年知識(shí)產(chǎn)權(quán)保護(hù)試題侵權(quán)行為與法律責(zé)任分析題庫(kù)
- 2026年AI與自然語(yǔ)言處理測(cè)試題
- 青霉素皮試及過(guò)敏試驗(yàn)相關(guān)知識(shí)考核試題與答案
- 軍人崗位奉獻(xiàn)課件
- 鋼材銷(xiāo)售年終工作總結(jié)
- 腱鞘囊腫護(hù)理查房
- T/ZGZS 0302-2023再生工業(yè)鹽氯化鈉
- 2025年上海市公務(wù)員《行政職業(yè)能力測(cè)驗(yàn)(A卷)》試題(網(wǎng)友回憶版)
- 城市更新與區(qū)域經(jīng)濟(jì)刺激-洞察闡釋
- GB/T 7573-2025紡織品水萃取液pH值的測(cè)定
- 境內(nèi)大中小型企業(yè)貸款專(zhuān)項(xiàng)統(tǒng)計(jì)制度
- T-FSS 41-2024 蒸氣壓縮循環(huán)冷水(熱泵)機(jī)組
- 北師版-八年級(jí)數(shù)學(xué)上冊(cè)常見(jiàn)計(jì)算題練習(xí)
評(píng)論
0/150
提交評(píng)論