亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

.NET簡談組件程序設(shè)計之(多線程與并發(fā)管理一)

系統(tǒng) 2176 0

由于多線程的內(nèi)容比較多我會用幾篇文章來講解。

多線程在我們?nèi)粘i_發(fā)過程中用的很多,上一篇“ .NET簡談組件程序設(shè)計之(異步委托) ”詳細的講解了基于委托的多線程使用,委托是基于后臺線程池的原理,這篇文章將主要介紹直接使用Thread對象來實現(xiàn)多線程。

當然使用Thread沒有使用Delegate那么容易,畢竟多線程跟異步調(diào)用是兩個相差很大的技術(shù)方向,我也是略懂點皮毛,在此獻丑給大家,如有講的不對的地方還請指出。 [王清培版權(quán)所有,轉(zhuǎn)載請給出署名]

我們先來理解幾個概念,以方便我們學習。

后臺線程與前臺線程

前臺線程:什么叫前臺線程,就是我們使用默認的Thread創(chuàng)建出來的沒有進行IsBackground屬性設(shè)置的都是前臺線程,因為默認IsBackground是false。前臺線程是明確任務的,也就是任何一個前臺線程沒有結(jié)束之前程序是不會自動退出的,除非強制關(guān)閉應用程序。

后臺線程:后臺線程是針對前臺線程來說的,將Thread.IsBackground設(shè)置為true就是后臺線程,后臺線程是為前臺線程服務的,就是說后臺線程沒有很強的生命力,只要前臺線程都結(jié)束了,后臺線程都強制結(jié)束,哪怕任務還沒有完成都不行。所以我們在使用的時候要看情況進行選擇。 [王清培版權(quán)所有,轉(zhuǎn)載請給出署名]

線程的切換

我們來看一段代碼,以方便引入主題。


這是一段很簡單的代碼,就是一個ShowMessage方法,在方法里面有一個獲取當前上下文線程的靜態(tài)屬性Thread.CurrentThread,然后輸入該線程的名稱和托管ID號;

這是調(diào)用代碼,我先給主線程起個名字,然后輸出。我新建了一個thread線程,這是子線程,調(diào)用我們上面定義的方法,用同樣的Thread.CurrentThread來獲取當前上下文線程,最后讓主線程休眠一秒鐘。

.NET簡談組件程序設(shè)計之(多線程與并發(fā)管理一)

通過該圖我們能清楚的看見,系統(tǒng)在后臺自動幫我們進行線程切換,用同一個靜態(tài)變量就可以獲取到當前線程對象。

通過Sleep方法是讓當前線程休眠指定的時間斷,哪怕當前線程正在CPU上運行著,一旦調(diào)用Sleep就立刻放棄CPU給它的時間片,進入阻塞狀態(tài)。

[一個線程僅僅是一個進程中的執(zhí)行路徑]

其實線程是執(zhí)行路徑,系統(tǒng)中維護著一個執(zhí)行路徑的命令集合,當我們開啟了多個線程的時候其實就是往著個命令集合中存放了很多要執(zhí)行的命令而已,換句話說命令就是線程隊列,用CPU 對它進行時間片的執(zhí)行。

那么線程是肯定需要一系列的狀態(tài)的,這個狀態(tài)時有OS幫我們維持著,因為線程是屬于內(nèi)核層的對象,只有OS才能實時監(jiān)控著。我們只需要用就行了,有興趣的朋友可以參考,杰夫瑞 (Jeffrey Richter)《Windows核心編程(第5版)》一書。

讓線程等待而不是切換

Sleep是強制放棄CPU的時間片,然后重新和其他線程一起參與CPU的競爭。用Sleep是會讓線程放棄CPU的使用權(quán),而如果我們換成 Thread.SpinWait(100000000),是不會放棄CPU的使用權(quán)的,只是讓CPU去執(zhí)行一段沒有用的代碼,當時間結(jié)束之后能立馬繼續(xù)執(zhí)行,而不是和重新參與CPU的競爭。

在系統(tǒng)資源很豐富的情況下可能這點并不重要,但是在資源缺乏,CPU又不是很好的時候,我想這點還是能改善點性能的。

在此不得不提一個重要的概念,就是線程的調(diào)用方和線程主體,線程的調(diào)用方就是線程的客戶端,是另外一個線程,而不是當前線程主體。

Thread.Join()連接線程

join方法從字面理解是連接的意思,剛接觸真的很難理解,什么叫連接。請看一段代碼:

通過Join我們可以等待線程結(jié)束,連接的意思就是將我和我調(diào)用的thread線程連接起來,我要等你結(jié)束之后我才能繼續(xù)執(zhí)行,這里就是主線程和子線程的關(guān)系,只有子線程技術(shù)之后,主線程才能繼續(xù)執(zhí)行。

Thread.Abort終止線程

利用Abort可以終止一個在執(zhí)行的線程,但是Abort會在線程上引發(fā)一個ThreadAbortException異常。

.NET簡談組件程序設(shè)計之(多線程與并發(fā)管理一)

Thread.IsBackground = true后臺線程

通過設(shè)置IsBackground可以讓線程處于后臺線程,只要前臺線程結(jié)束,那么后臺線程自動終止。

我們將一段代碼注釋掉。


這是調(diào)用代碼。只要前臺線程不結(jié)束,后臺線程就一直執(zhí)行。如果我們在最后加上一段Console.ReadLine();代碼,那么后臺線程會始終運行著。

這篇文章就先結(jié)束了,下一篇我們將學習關(guān)于同步域和上下文的概念。





.NET簡談組件程序設(shè)計之(多線程與并發(fā)管理一)


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 湿湿影院在线观看 | 欧美一级毛片aaa片 欧美一级毛片不卡免费观看 | 成人久久视频 | 亚洲精品一区二区深夜福利 | 黄色免费看网站 | 尤物视频黄 | 久久亚洲国产伦理 | 99青青| 免费乱理伦片在线观看老妇 | 高清视频在线播放 | 老司机午夜网站 | 亚洲天天操 | 亚洲精国产一区二区三区 | 久久国产香蕉 | 精品国产视频在线观看 | 国产亚洲精品精品国产亚洲综合 | 国产自愉自愉全免费高清 | 欧美精品久久久久久久久大尺度 | 国产欧美日韩免费一区二区 | 国产欧美日韩高清专区ho | 亚洲成a v人片在线观看 | 色四虎| 99热精品国产三级在线观看 | 国产在线视频www色 国产在线视频凹凸分类 | 亚洲综合伦理一区 | 奇米影视在线视频8888 | 老色99久久九九精品尤物 | 国产一区二区精品久久 | 久久国产热 | 久草视频在线播放 | 国产精品视频男人的天堂 | 久久国产免费 | 精品一区二区视频在线观看 | 88精品视频| 久久高清免费 | 日日操操干干 | 99精品国产自在现线观看 | 国产全黄a一级毛片视频 | 久久福利影院 | 午夜精品久久久久久久第一页 | 日本免费毛片在线高清看 |