版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第十一章 創(chuàng)建多線程程序,沈項軍 計算機科學與通信工程學院,2,內容提要,實現線程 定義線程的生命周期 實現多線程 識別線程的優(yōu)先級 在線程中使用同步 識別進程間的通信,3,同時執(zhí)行所有任務,時間更少,效率更高,線程簡介,在同一時間點執(zhí)行各項進程,編譯程序 發(fā)送/接收郵件 打印文件 其他,操作系統(tǒng)允許計算機同時執(zhí)行多項操作,程序 (進程),4,線程簡介,程序 1,程序 2,線程 1,線程 2,線程 3,線程 1,線程 2,線程 3,單獨的執(zhí)行路徑,多線程,5,進程和線程,進程是程序的一次執(zhí)行 一個或多個線程構成一個進程,進程,線程,6,線程簡介,在以下情況中可能要使用到多線程:,程序需要同時執(zhí)
2、行兩個或多個任務,程序要等待某事件的發(fā)生,例如用戶輸入、文件操作、網絡操作、搜索等,后臺程序,7,線程及多線程工作原理,線程表示計算機執(zhí)行的指令序列。 一個處理器在某一刻只能處理一個任務。如果有一個多處理器系統(tǒng),理論上它可以同時執(zhí)行多個指令一個處理器執(zhí)行一個指令,但大多數人使用的是單處理器計算機,這種情況是不可能同時發(fā)生的。而實際上,Windows操作系統(tǒng)表面上可以同時處理多個任務,這個過程稱為搶先式多任務處理(pre-emptive multitasking)。,8,搶先式多任務處理,所謂搶先式多任務處理,是指Windows在某個進程中選擇一個線程,該線程運行一小段時間。Microsoft沒
3、有說明這段時間有多長,因為為了獲得最好的性能,Windows有一個內部操作系統(tǒng)參數來控制這個時間值。但在運行Windows應用程序時,用戶不需要知道它。從我們的角度來看,這個時間非常短,肯定不會超過幾毫秒。這段很短的時間稱為線程的時間片(time slice)。過了這個時間片后,Windows就收回控制權,選擇下一個被分配了時間片的線程。這些時間片非常短,我們可以認為許多事件是同時發(fā)生的。,9,實現線程,線程被用來運行完成大型和復雜計算的程序。 使用一個線程執(zhí)行的進程被稱為單線程進程,這里進程是一個程序的運行實例。 單線程程序一次僅可以完成一個任務。在另一個任務開始之前,你必須等待一個任務完成
4、。,10,實現線程,下圖顯示了單線程進程。 為了一次執(zhí)行多于一個任務,你可以在程序中創(chuàng)建多個線程。 創(chuàng)建兩個或更多線程的進程被稱為多線程進程。,11,C#中的線程模型,在單線程模型中,程序使用輪詢來調用事件循環(huán)。 輪詢是一個進程,在其中一次執(zhí)行一個單一的事件。 在帶有輪詢方法的事件循環(huán)中,單一線程以無限循環(huán)的方式運行直到它的操作完成。 在單線程程序中,如果線程從執(zhí)行被掛起因為它正在等待一個系統(tǒng)資源,整個程序停止執(zhí)行。 在多線程中,一個線程等待的CPU時間可以被用來完成另一個任務。,12,C#中的線程模型,在CLR中有兩種線程 System.Threading.Thread代表托管線程 Syst
5、em.Diagonostics.ProcessThread代表OS線程 using System; class HelloWorld static void Main() Console.WriteLine (Hello, World); Console.ReadLine(); ,13,主線程,主線程在C#程序開始執(zhí)行的時候被自動創(chuàng)建。 使用Thread類被排他創(chuàng)建的線程被稱為子線程,其中主線程被稱為父線程或者基本線程。 你可以使用Thread類的CurrentThread屬性來訪問線程。,14,使用線程,在C#中,通過ThreadStart創(chuàng)建線程調用方法的引用,并將該引用通過創(chuàng)建一個Thr
6、ead類型的對象創(chuàng)建一個線程,接著調用新線程的Start()方法啟動線程。 ThreadStart ChildRef = new ThreadStart(ChildThreadCall); Thread ChildThread = new Thread(ChildRef); ChildThread.Start();,引用System.Threading 命名空間,Thread 線程實例名 = new Thread(new ThreadStart(方法名);,只創(chuàng)建但不啟動線程,線程實例名.Start();,啟動線程,15,使用線程,新線程開始異步執(zhí)行線程的方法調用。 線程的處理 啟動線程(St
7、art方法) 掛起線程(Suspend方法) 掛起不會立即生效 恢復被刮起的線程(Resume方法) 恢復不會立即生效 終止線程(Abort方法) 線程的休眠(Sleep方法),16,管理線程,有許多你可能需要完成的任務來管理線程的活動或生命。 可以通過使用Thread類的各種可用線程方法來管理這些任務。 Thread.Sleep()靜態(tài)方法調用靜態(tài)CurrentThread方法,然后它在指定的時間內暫停線程。,17,管理線程,臨時掛起會話進程(用戶通常不會這么做,但這僅是一個示例,在更真實的示例中,用戶可能是暫停聲音文件或視頻文件的播放) 。 在主線程中編寫如下代碼,掛起該線程: depth
8、ChangeThread.Suspend(); 如果需要恢復該線程,可以使用下面的方法: depthChangeThread.Resume(); 如需要退出該線程 depthChangeThread.Abort();,18,線程使用示例,using System; using System.Threading; class BasicThreadApp public static void ChildThreadCall() try Console.WriteLine(Child thread started); Console.WriteLine(Child thread - countin
9、g to 10); for (int i = 0; i 10; i+) Thread.Sleep(500); Console.Write(0., i); Console.WriteLine(Child thread finished); catch (ThreadAbortException e) Console.WriteLine(Exception has caught); finally Console.WriteLine(Child Thread - unable to be finished); ,public static void Main() ThreadStart Child
10、Ref = new ThreadStart(ChildThreadCall); Console.WriteLine(Main - Creating Child Thread); Thread ChildThread = new Thread(ChildRef); ChildThread.Start(); Console.WriteLine(Main - Sleeping for 2 seconds); Thread.Sleep(2000); Console.WriteLine(n Main - Aborting child thread); ChildThread.Abort(); Conso
11、le.ReadLine(); ,19,線程生命周期,當System.Threading.Thread類的對象被創(chuàng)建的時候,線程的生命周期開始。線程的生命周期結束于任務的執(zhí)行。 在線程的生命周期中有各種狀態(tài)。這些狀態(tài)是: 未啟動狀態(tài) 運行態(tài) 未運行態(tài) 死亡態(tài),20,未啟動狀態(tài),當一個Thread類的實例被創(chuàng)建的時候,線程進入未啟動狀態(tài)。 新線程是Thread類的一個空對象,沒有系統(tǒng)資源例如內存被分配給它。,21,運行態(tài),線程一直處在未啟動狀態(tài)直到程序調用Thread類的Start()方法,它將線程置于運行態(tài),并且立即返回控制到調用的線程。 這個狀態(tài)也被稱為準備或啟動狀態(tài)。 新啟動的線程和程序中任
12、何其它線程同時執(zhí)行。,22,Start(),Started,Work Completed,Stopped,線程生命周期,23,未運行態(tài),如果它處于下面的狀態(tài),那么線程處于未運行態(tài) 休眠 等待 阻塞,24,Start(),Started,Suspend(),Suspended,Resume(),線程生命周期,25,Start(),Started,Sleep(),Wait/Join Sleep,Interrupt(),Time Expires,線程生命周期,26,死亡狀態(tài),當線程方法的語句完成的時候,運行線程進入死亡狀態(tài)。這個狀態(tài)也被稱為終結態(tài)。 程序可以通過在適當的線程對象上調用Thread類的
13、Abort()方法來強迫線程進入死亡態(tài)。,27,Start(),Started,Abort(),Stop Request,Thread Responds to Stop Request,Stopped,線程生命周期,28,介紹多線程,多線程有助于同時完成各種操作,節(jié)省用戶的時間。 多線程允許你在一個程序中完成多個任務。 多任務是同時執(zhí)行多個任務的能力。 多任務可以被分成如下類型: 基于進程的多任務 基于線程的多任務,該女士在同時吃蘋果、看書 并在電腦上工作。,29,多線程的優(yōu)點和限制,多線程的優(yōu)點有: 改進性能 最小化系統(tǒng)資源 同時訪問多個程序 程序結構簡化 多線程的限制有: 競態(tài)情況同時讀寫
14、同一個變量 死鎖情況互相等待對方釋放所需資源 饑餓鎖低優(yōu)先級的線程無限等待,30,創(chuàng)建多線程示例,using System; using System.Threading; class ThreadSchedule public static void ChildThread1() Console.WriteLine(Child thread 1 started); Console.WriteLine(Child thread - counting from 1 to 10); for (int T = 1; T 11; T+) for (int Cnt = 0; Cnt 100; Cnt+)
15、 Console.Write(.); Console.Write(0, T); Console.WriteLine(Child thread 1 finished); public static void ChildThread2() Console.WriteLine(Child thread 2 started); Console.WriteLine(Child thread - counting slowly from 11 to 20); for (int T = 11; T 21; T+) for (int Cnt = 0; Cnt 100; Cnt+) Console.Write(
16、.); Console.Write(0, T); Console.WriteLine(Child thread 2 finished); ,public static void Main() ThreadStart Child1 = new ThreadStart(ChildThread1); ThreadStart Child2 = new ThreadStart(ChildThread2); Console.WriteLine(Main - Creating Child Threads); Thread Thread1 = new Thread(Child1); Thread Thread
17、2 = new Thread(Child2); Thread1.Start(); Thread2.Start(); ,31,確定線程的優(yōu)先級,控制線程行為的一個屬性是它的優(yōu)先級。 .NET運行環(huán)境基于它們的優(yōu)先級執(zhí)行線程。 線程是固定優(yōu)先級的調度的。帶有優(yōu)先級的每個線程在處理器的線程隊列中有自己的位置。,32,定義線程優(yōu)先級,線程優(yōu)先級是指定一個線程相對于另一個線程的優(yōu)先級的屬性。 線程的優(yōu)先級可以被定義為: 最高(Highest) 正常以上(AboveNormal) 正常(Normal) 正常以下(BelowNormal) 最低(Lowest) 高優(yōu)先級的線程在低優(yōu)先級的線程之前運行。 如果
18、C#遇到了另一個優(yōu)先級更高的線程,當前線程被推后;高優(yōu)先級的程序被執(zhí)行。,33,設置線程的優(yōu)先級,可以在創(chuàng)建了線程之后使用Thread類的Priority屬性設置線程的優(yōu)先級。 下面的語法顯示如何設置線程的優(yōu)先級: ThreadStart workerStart = new ThreadStart(StartMethod); Thread workerThread = new Thread(workerStart); workerThread.Name = Worker; workerThread.Priority = ThreadPriority.AboveNormal; workerThr
19、ead.Start();,34,設置線程的優(yōu)先級,如果有多個有相同優(yōu)先級的線程,調度器在同一優(yōu)先級循環(huán)執(zhí)行線程,假設每個線程執(zhí)行的時間片是固定的。 只要高優(yōu)先級的線程可以運行,低優(yōu)先級的線程就不能被執(zhí)行。 當在給定的優(yōu)先級沒有可運行的線程的時候,調度器移動到下一個低優(yōu)先級,調度那個優(yōu)先級的線程執(zhí)行。,35,線程的調度,CLR把所有處于執(zhí)行狀態(tài)(runnable)的線程,按照優(yōu)先級的不同分別放置在不同的池中。當一個阻塞的線程變?yōu)閞unnable狀態(tài)時,它被放置到相應的池中。具有最高優(yōu)先級的非空線程池中的線程被賦予CPU時間。,36,在線程中使用同步,使用線程的一個重要方面是同步訪問多個線程訪問的
20、任何變量。 所謂同步,是指在某一時刻只有一個線程可以訪問變量。 如果不能確保對變量的訪問是同步的,就會產生錯誤。,37,同步線程,線程的同步確保如果兩個或更多線程需要訪問一個共享的資源,那么那個資源一次僅有一個線程可以使用。 可以使用synchronized關鍵字來同步代碼。 同步是基于監(jiān)視的概念的。監(jiān)視器是用做鎖定數據成員和類的方法的對象。,38,同步線程,39,使用監(jiān)視器鎖鎖定代碼,System.Monitor類使你能夠通過使用鎖和信號來序列化代碼鎖的訪問。 用Monitor.Enter方法鎖住資源 用Monitor.Exit方法釋放鎖,40,使用監(jiān)視器鎖的示例,書上例子,41,使用帶有C# Lock語句的監(jiān)視器鎖,另一個鎖定代碼的方法是使用C# lock語句。 盡管C# lock語句不支持Monitor類中的全部集合特性,但它使你能夠獲得和釋放一個監(jiān)視器的鎖。 其用法如下所示: lock (x) DoSomething(); ,42,Lock語句示例,書店可能某種書籍只有一本,而兩個售貨員同時銷售這本書,我們可以把兩個售貨員看作兩個線程,那該如何處理呢?,using System; using System.Threading; public class BookShop public
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學(車輛工程)汽車造型設計試題及答案
- 2025年中職(助產)產前護理階段測試題及答案
- 2025年中職市政工程施工(道路施工工藝)試題及答案
- 2025年高職(云計算技術應用)云服務器搭建試題及解析
- 2025年中職月球與行星科學(月球科學)技能測試題
- 2025年中職第二學年(康復技術)康復護理試題及答案
- 2025年中職環(huán)境工程(大氣污染防治基礎)試題及答案
- 2025年高職第一學年(眼視光學)低視力康復基礎綜合測試試題及答案
- 2026年鄭州信息科技職業(yè)學院單招綜合素質筆試參考題庫附答案詳解
- 2026年河南工業(yè)和信息化職業(yè)學院單招綜合素質筆試備考題庫帶答案解析
- 2026年中文投(陜西)文化傳媒有限公司招聘備考題庫完整參考答案詳解
- 2025年上海農林職業(yè)技術學院馬克思主義基本原理概論期末考試模擬題附答案
- 形勢與政策(2025秋)超星學習通章節(jié)測試答案
- GB/T 222-2025鋼及合金成品化學成分允許偏差
- PLC技術應用ppt課件(完整版)
- 地基與基礎工程質量管理講解PPT(173頁圖文)
- SJG 71-2020 橋梁工程設計標準
- MFD 多功能顯示器操作手冊中文版
- 深入講解新版《義務教育課程方案》2022年《義務教育課程方案(2022版)》PPT課件
- 冀教版六年級英語上冊教案
- 大一英語期末期末考試試題內含答案
評論
0/150
提交評論