由于多線程的內容比較多我會用幾篇文章來講解。
多線程在我們日常開發過程中用的很多,上一篇“ .NET簡談組件程序設計之(異步委托) ”詳細的講解了基于委托的多線程使用,委托是基于后臺線程池的原理,這篇文章將主要介紹直接使用Thread對象來實現多線程。
當然使用Thread沒有使用Delegate那么容易,畢竟多線程跟異步調用是兩個相差很大的技術方向,我也是略懂點皮毛,在此獻丑給大家,如有講的不對的地方還請指出。 [王清培版權所有,轉載請給出署名]
我們先來理解幾個概念,以方便我們學習。
后臺線程與前臺線程
前臺線程:什么叫前臺線程,就是我們使用默認的Thread創建出來的沒有進行IsBackground屬性設置的都是前臺線程,因為默認IsBackground是false。前臺線程是明確任務的,也就是任何一個前臺線程沒有結束之前程序是不會自動退出的,除非強制關閉應用程序。
后臺線程:后臺線程是針對前臺線程來說的,將Thread.IsBackground設置為true就是后臺線程,后臺線程是為前臺線程服務的,就是說后臺線程沒有很強的生命力,只要前臺線程都結束了,后臺線程都強制結束,哪怕任務還沒有完成都不行。所以我們在使用的時候要看情況進行選擇。 [王清培版權所有,轉載請給出署名]
線程的切換
我們來看一段代碼,以方便引入主題。
這是一段很簡單的代碼,就是一個ShowMessage方法,在方法里面有一個獲取當前上下文線程的靜態屬性Thread.CurrentThread,然后輸入該線程的名稱和托管ID號;
這是調用代碼,我先給主線程起個名字,然后輸出。我新建了一個thread線程,這是子線程,調用我們上面定義的方法,用同樣的Thread.CurrentThread來獲取當前上下文線程,最后讓主線程休眠一秒鐘。
通過該圖我們能清楚的看見,系統在后臺自動幫我們進行線程切換,用同一個靜態變量就可以獲取到當前線程對象。
通過Sleep方法是讓當前線程休眠指定的時間斷,哪怕當前線程正在CPU上運行著,一旦調用Sleep就立刻放棄CPU給它的時間片,進入阻塞狀態。
[一個線程僅僅是一個進程中的執行路徑]
其實線程是執行路徑,系統中維護著一個執行路徑的命令集合,當我們開啟了多個線程的時候其實就是往著個命令集合中存放了很多要執行的命令而已,換句話說命令就是線程隊列,用CPU 對它進行時間片的執行。
那么線程是肯定需要一系列的狀態的,這個狀態時有OS幫我們維持著,因為線程是屬于內核層的對象,只有OS才能實時監控著。我們只需要用就行了,有興趣的朋友可以參考,杰夫瑞 (Jeffrey Richter)《Windows核心編程(第5版)》一書。
讓線程等待而不是切換
Sleep是強制放棄CPU的時間片,然后重新和其他線程一起參與CPU的競爭。用Sleep是會讓線程放棄CPU的使用權,而如果我們換成 Thread.SpinWait(100000000),是不會放棄CPU的使用權的,只是讓CPU去執行一段沒有用的代碼,當時間結束之后能立馬繼續執行,而不是和重新參與CPU的競爭。
在系統資源很豐富的情況下可能這點并不重要,但是在資源缺乏,CPU又不是很好的時候,我想這點還是能改善點性能的。
在此不得不提一個重要的概念,就是線程的調用方和線程主體,線程的調用方就是線程的客戶端,是另外一個線程,而不是當前線程主體。
Thread.Join()連接線程
join方法從字面理解是連接的意思,剛接觸真的很難理解,什么叫連接。請看一段代碼:
通過Join我們可以等待線程結束,連接的意思就是將我和我調用的thread線程連接起來,我要等你結束之后我才能繼續執行,這里就是主線程和子線程的關系,只有子線程技術之后,主線程才能繼續執行。
Thread.Abort終止線程
利用Abort可以終止一個在執行的線程,但是Abort會在線程上引發一個ThreadAbortException異常。
Thread.IsBackground = true后臺線程
通過設置IsBackground可以讓線程處于后臺線程,只要前臺線程結束,那么后臺線程自動終止。
我們將一段代碼注釋掉。
這是調用代碼。只要前臺線程不結束,后臺線程就一直執行。如果我們在最后加上一段Console.ReadLine();代碼,那么后臺線程會始終運行著。
這篇文章就先結束了,下一篇我們將學習關于同步域和上下文的概念。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
