之前的兩篇文章我們了解了委托和事件,本文我們看一下線程。
A,進程,包含程序運行所需要的資源 ,在大多數情況下是指 程序。(商店:囤積要使用的資源的地方)
B,線程,是在進程中能夠被CPU調用的程序單元,是提供給CPU運行程序的代碼片段。(商店員工:是運行程序的行動者)
C,一個進程至少一個線程,每一個線程有自己專屬的寄存器(棧指針、程序計數器等)但代碼區是共享的,不同的線程可以執行同樣的函數
D,同一進程中的多個線程之間可以“并發”執行
A,讓CPU主動執行不同的程序單元,這樣就不至于被某個程序的惡意代碼引起死機癥狀
B,讓計算機“同時”做多個事情,節約時間
C,CPU在不同的線程里面切換,在不同的進程里面切換
A,非搶占式調度:是指某個線程在運行的過程中不會被操作系統強制性暫停,線程可以一直運行到告一段落或者主動交出運行權。線程的運行完全是單隊列的(像排序買票一樣),這樣可能產生惡意程序長期霸占運行權的情況,而且一旦一個程序死掉了,電腦只能重啟了。
B,搶占式調度:每個線程有極少的運行時間(在Windows內核模式下這個時間不會超過20ms),當時間用完的時候線程就會被強制暫停,保存上下文并把CPU的運行權交給下一個線程,這樣調度的結果就是所有的線程都在被快速的切換運行,這樣給客戶端的感覺就是線程在“并行同時” 運行。
C, 線程的調用由CPU決定,所以調用Thread實例的Start方法,標記該線程可以被CPU執行了,但具體執行時間由CPU決定。
線程中的寄存器存在當前執行的代碼號,堆棧存儲當前運行的變量的值。當CPU執行再次回到這個線程的時候讀取之前寄存器和堆棧中保存的數據。
程序代碼,編譯以后是CPU的指令集,CPU對指定集執行只讀操作。 如下圖:
A, 編寫產生線程需要執行的方法
B,引用System.Threading命名空間
C,實例化Thread類,并傳入一個指向線程所需要運行方法的委托(線程已經產生,還沒有開始運行)
D,調用Tread實例的Start方法,標記該線程可以被CPU執行了(具體執行時間由CPU決定)
/// <summary> /// 多線程 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> PRivate void btnThread_Click(object sender, EventArgs e) { //1,創建線程并通過委托語法糖 傳入方法 Thread thrSon = new Thread(CountDo); //2,設置為后臺線程 thrSon.IsBackground = true; //3,啟動線程 thrSon.Start(); } void CountDo() { int i = 0; while (true) { if (i < 999999999) { i++; } else { break; } } MessageBox.Show("計算完畢:" + i); }
線程是存儲單元,是存儲在內存中的空間,存儲的是任務列表,要去做什么事情!這些任務交給CPU去做。CPU決定什么時候去做。
線程是幫助CPU完成搶斷式執行的基礎數據類型,用來存儲CPU每次執行未完成時需要保存的代碼執行信息。(如:正在執行哪個方法?執行到第幾行了?方法里的變量值為什么?)
線程之間切換需要保存當前執行狀態,以及讀取切換前的執行狀態,這個多線程的消耗。
新聞熱點
疑難解答