實例代碼講解c# 線程(上)
簡介
過去普通計算機(jī)只有計算單元,卻不能同時執(zhí)行多個任務(wù)。然而操作系統(tǒng)卻已經(jīng)可以同時運(yùn)行多個應(yīng)用程序,即實現(xiàn)了多任務(wù)的概念。為了防止一個應(yīng)用程序控制CPU而導(dǎo)致其他應(yīng)用程序和操作系統(tǒng)本身永遠(yuǎn)被掛起這一可能情況,操作系統(tǒng)不得不使用某種方式 將物理計算單元分割為一些虛擬的進(jìn)程,并給予每個程序一定量的計算能力。此外,操作系統(tǒng)必須始終能夠優(yōu)先訪問CPU,并能調(diào)整不同程序訪問CPU的優(yōu)先級。線程正是這一概念的實現(xiàn)??梢哉J(rèn)為線程是一個虛擬進(jìn)程,用于獨立運(yùn)行一個特定的程序。 (請記住線程會消耗大量的操作系統(tǒng)資源。多個線程共享一個物理處理器將導(dǎo)致操作系統(tǒng)忙于管理這些線程,而無法運(yùn)行程序。)
接下來創(chuàng)建一個控制臺應(yīng)用程序
class Program { static void Main(string[] args) { Thread t = new Thread(PrintNumbers); t.Start(); PrintNumbers(); Console.ReadKey(); } static void PrintNumbers() { Console.WriteLine("Starting..."); for (int i = 1; i < 10; i++) { Console.WriteLine(i); } } }
結(jié)果兩組范圍為1到10的數(shù)字會隨機(jī)交叉輸出。這說明了printnumbers方法同時運(yùn)行在主線程和另一個線程中。
static void DoNothing() { Thread.Sleep(TimeSpan.FromSeconds(2)); } static void PrintNumbersWithStatus() { Console.WriteLine("Starting..."); Console.WriteLine(Thread.CurrentThread.ThreadState.ToString()); for (int i = 1; i < 10; i++) { Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine(i); } }
在main方法中加入以下代碼片段
Console.WriteLine("Starting program..."); Thread t = new Thread(PrintNumbersWithStatus); Thread t2 = new Thread(DoNothing); Console.WriteLine(t.ThreadState.ToString()); t2.Start(); t.Start(); for (int i = 1; i < 30; i++) { Console.WriteLine(t.ThreadState.ToString()); } Thread.Sleep(TimeSpan.FromSeconds(6)); t.Abort(); Console.WriteLine("A thread has been aborted"); Console.WriteLine(t.ThreadState.ToString()); Console.WriteLine(t2.ThreadState.ToString());
工作原理 當(dāng)主程序啟動時定義了兩個不同的線程。一個將被終止,另一個則會成功完成運(yùn)行。線程狀態(tài)位于Thread對象的ThreadState屬性中。ThreadState屬性是一個C#枚舉對象。剛開始線程狀態(tài)為ThreadState.Unstarted。然后我們啟動線程,并估計在一個周期30次迭代的區(qū)間中,線程狀態(tài)會從ThreadState.Running變?yōu)門hreadState.WaitSleepJoin。 如果實際情況與以上不符,請增加迭代次數(shù),終止第一個線程后,會看到現(xiàn)在該線程狀態(tài)為ThreadState.Aborted。程序也有可能會打印出ThreadState.AbortRequested狀態(tài)。這充分說明了同步兩個線程的復(fù)雜性。請記住不要在程序中使用線程終止。我在這里使用他只是為了展示相應(yīng)的線程狀態(tài)。最后可以看到第二個線程t2成功完成并且狀態(tài)為ThreadState.Stopped。另外還有一些其他的線程狀態(tài),但是要么已經(jīng)被棄用,要么沒有我們試驗過的幾種狀態(tài)有用。
到此這篇關(guān)于實例代碼講解c# 線程(上)的文章就介紹到這了,更多相關(guān)c# 線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用c#實現(xiàn)隨機(jī)數(shù)猜數(shù)游戲的示例代碼
這篇文章主要介紹了使用c#實現(xiàn)隨機(jī)數(shù)猜數(shù)游戲的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09C#中ToString數(shù)據(jù)類型格式大全(千分符)
這篇文章主要介紹了C#中ToString數(shù)據(jù)類型格式大全 千分符,需要的朋友可以參考下2017-02-02C#實現(xiàn)Word轉(zhuǎn)換TXT的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C#實現(xiàn)Word轉(zhuǎn)換TXT的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12C#實現(xiàn)windows form限制文本框輸入的方法
這篇文章主要介紹了C#實現(xiàn)windows form限制文本框輸入的方法,涉及C#限制文本框輸入的技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04