色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

掌握多線程技術(shù)

li5236 ? 來(lái)源:dotNet工控上位機(jī) ? 作者:dotNet工控上位機(jī) ? 2022-03-29 14:08 ? 次閱讀

前言

初學(xué)者學(xué)習(xí)編程時(shí),很容易因?yàn)槎嗑€程出現(xiàn)各種問(wèn)題,導(dǎo)致不敢使用多線程。但是多線程技術(shù)在做開(kāi)發(fā)中,是不可忽視的一個(gè)技術(shù),基本上我們實(shí)際應(yīng)用中,每個(gè)項(xiàng)目都會(huì)使用多線程,所以多線程技術(shù)必須掌握。

為什么要用多線程

隨著工業(yè)的進(jìn)步,現(xiàn)在的筆記本、臺(tái)式機(jī)大都是雙核的,4核、8核甚至16核,也很常見(jiàn),如果是單線程的程序,那么在雙核CPU上就浪費(fèi)了50%,在4核CPU上就浪費(fèi)了75%。

單核CPU上所謂的”多線程”那是假的多線程,同一時(shí)間處理器只會(huì)處理一段邏輯,只不過(guò)線程之間切換得比較快,看著像多個(gè)線程”同時(shí)”運(yùn)行罷了。

多核CPU上的多線程才是真正的多線程,它能讓你的多段邏輯同時(shí)工作,多線程,可以真正發(fā)揮出多核CPU的優(yōu)勢(shì)來(lái),達(dá)到充分利用CPU的目的。

如果你做項(xiàng)目不使用多線程,不僅是技術(shù)的問(wèn)題,也是對(duì)電腦資源的極大浪費(fèi),就像你買(mǎi)了一輛配置非常高的越野車,你僅僅只用它來(lái)日常代步一樣。3

為什么不敢用多線程

之前跟一些學(xué)員溝通時(shí)發(fā)現(xiàn),很多學(xué)員之所以不敢使用多線程,是因?yàn)橹俺鲞^(guò)問(wèn)題,有種“一朝被蛇咬,十年怕井繩”的感覺(jué)。

為什么多線程容易出問(wèn)題,有個(gè)主要的原因在于多線程充滿著“未知性”,有的人使用時(shí),發(fā)現(xiàn)代碼并沒(méi)有按照預(yù)想的流程在走,這其實(shí)是正常的。

我們必須要明確一點(diǎn),多線程確實(shí)是“不可控的”,有某種意義上來(lái)說(shuō),多線程是靠CPU調(diào)度來(lái)執(zhí)行的,并非人為去控制。

我們所謂的控制多線程,僅僅是.NET框架開(kāi)放了一些接口開(kāi)發(fā)者,這樣可以相對(duì)性地間接控制多線程的啟動(dòng)停止暫停繼續(xù)。

線程的啟動(dòng)停止

線程的啟動(dòng)停止,從.Net Framework 4.5開(kāi)始,Task提供了一個(gè)叫CancellationTokenSource的對(duì)象,可以使用它來(lái)對(duì)多線程的啟停進(jìn)行控制。

首先,我們做一個(gè)線程任務(wù),這個(gè)任務(wù)很簡(jiǎn)單,只是不斷操作某個(gè)變量,每0.1秒加1,到一定值之后,重置為0,然后將這個(gè)值顯示在界面上,界面如下所示:

pYYBAGJCommAHohAAAEBK_S4MA8205.png

所以任務(wù)方法如下:

poYBAGJCommAUQsFAAFCzNteiYk911.png

個(gè)對(duì)象就是CancellationTokenSource的對(duì)象,因此我們需要?jiǎng)?chuàng)建一個(gè)CancellationTokenSource對(duì)象cts:

pYYBAGJCommAeFBDAAByrWJa05o840.png

然后在啟動(dòng)線程按鈕的事件里,編寫(xiě)代碼如下:

poYBAGJCommALjvEAAC33LkZg20419.png

停止線程按鈕的事件里,只需要調(diào)用cts的Cancel方法即可:

pYYBAGJCommAfnHqAACJjBQEKQs412.png

其實(shí),說(shuō)白了,就是通過(guò)cts來(lái)控制cts的IsCancellationRequested屬性,進(jìn)而實(shí)現(xiàn)多線程的控制。

線程的暫停繼續(xù)

多線程的暫停繼續(xù),.NET為我們提供了另外一個(gè)對(duì)象——ManualResetEvent,這個(gè)對(duì)象會(huì)有一個(gè)值,這個(gè)值是布爾類型,就像一個(gè)門(mén)閘一樣,True是打開(kāi)門(mén)閘,F(xiàn)alse是關(guān)閉門(mén)閘,所以想要暫停多線程就調(diào)用這個(gè)對(duì)象的Reset方法,想要繼續(xù)多線程就調(diào)用這個(gè)對(duì)象的Set方法,使用非常簡(jiǎn)單。

首先我們創(chuàng)建一下這個(gè)對(duì)象,可以通過(guò)構(gòu)造方法,給這個(gè)對(duì)象賦初始值,我這里為T(mén)rue,這樣就能直接運(yùn)行,不會(huì)阻塞。

poYBAGJCommAFYwjAACT6iBUZqo649.png

但是如果希望這個(gè)對(duì)象與多線程有所聯(lián)系,必須要在多線程的方法里體現(xiàn)這個(gè)對(duì)象的作用,這個(gè)是調(diào)用這個(gè)對(duì)象的WaitOne方法,表示在調(diào)用的地方阻塞住,通過(guò)判斷True或者False來(lái)決定是否繼續(xù)執(zhí)行,就像大家開(kāi)車過(guò)高速收費(fèi)站一樣,即使現(xiàn)在普遍采用ETC了,在入口也需要減速,有一個(gè)ETC識(shí)別的過(guò)程,識(shí)別成功才會(huì)抬桿,識(shí)別識(shí)別,桿子是不會(huì)自動(dòng)抬起的,這個(gè)是一樣的道理。

所以線程執(zhí)行代碼如下:

pYYBAGJComqAQ0XgAACDmtYVuHw124.png

對(duì)比一下,其實(shí)就是加了一個(gè)manual.WaitOne()。

線程暫停代碼:

poYBAGJComqAWj-YAAAuPKiIW90610.png

線程繼續(xù)代碼:

pYYBAGJComqACdzRAAB-g448phs190.png

AutoResetEvent

AutoResetEvent和ManualResetEvent的用法非常相似,區(qū)別在于一個(gè)是手動(dòng),一個(gè)是自動(dòng),AutoResetEvent會(huì)在置位之后自動(dòng)復(fù)位,這樣體現(xiàn)在多線程里,就是會(huì)只執(zhí)行一次,就像大家進(jìn)小區(qū)一樣,如果有10輛車在排隊(duì),這時(shí)候如果自動(dòng)模式,每次只能進(jìn)一輛車,如果是手動(dòng)模式,可以由保安控制門(mén)閘打開(kāi),等10輛車都進(jìn)去之后,再由保安將門(mén)閘關(guān)注。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    278

    瀏覽量

    20051
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4821

    瀏覽量

    68890
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    socket 多線程編程實(shí)現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程中,多線程技術(shù)被廣泛應(yīng)用于提高服務(wù)器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線程技術(shù)應(yīng)用于Socket編程,可以顯著提升服務(wù)器的性能。
    的頭像 發(fā)表于 11-12 14:16 ?438次閱讀

    Python中多線程和多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見(jiàn)的兩種方式之一。在本文中,我們將探討Python中多線程與多進(jìn)程的概念、區(qū)別以及如何使用線程池與進(jìn)程池來(lái)提高并發(fā)執(zhí)行效率。
    的頭像 發(fā)表于 10-23 11:48 ?458次閱讀
    Python中<b class='flag-5'>多線程</b>和多進(jìn)程的區(qū)別

    一文掌握Python多線程

    使用線程可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理。
    的頭像 發(fā)表于 08-05 15:46 ?908次閱讀

    ESP32會(huì)不會(huì)有多線程問(wèn)題,需要加鎖嗎?

    ESP32會(huì)不會(huì)有多線程問(wèn)題,需要加鎖嗎
    發(fā)表于 07-19 08:05

    多線程設(shè)計(jì)模式到對(duì) CompletableFuture 的應(yīng)用

    最近在開(kāi)發(fā) 延保服務(wù) 頻道頁(yè)時(shí),為了提高查詢效率,使用到了多線程技術(shù)。為了對(duì)多線程方案設(shè)計(jì)有更加充分的了解,在業(yè)余時(shí)間讀完了《圖解 Java 多線程設(shè)計(jì)模式》這本書(shū),覺(jué)得收獲良多。本篇
    的頭像 發(fā)表于 06-26 14:18 ?407次閱讀
    從<b class='flag-5'>多線程</b>設(shè)計(jì)模式到對(duì) CompletableFuture 的應(yīng)用

    bootloader開(kāi)多線程做引導(dǎo)程序,跳app初始化后直接進(jìn)hardfualt,為什么?

    如標(biāo)題,想做一個(gè)遠(yuǎn)程升級(jí)的項(xiàng)目,bootloader引導(dǎo)區(qū)域和app都是開(kāi)多線程跑的,就是自己寫(xiě)了個(gè)小的任務(wù)調(diào)度器,沒(méi)什么功能主要是想讓程序快速的響應(yīng),延時(shí)不會(huì)對(duì)其他程序造成堵塞,程序測(cè)試
    發(fā)表于 04-18 06:07

    鴻蒙OS開(kāi)發(fā)實(shí)例:【ArkTS類庫(kù)多線程CPU密集型任務(wù)TaskPool】

    CPU密集型任務(wù)是指需要占用系統(tǒng)資源處理大量計(jì)算能力的任務(wù),需要長(zhǎng)時(shí)間運(yùn)行,這段時(shí)間會(huì)阻塞線程其它事件的處理,不適宜放在主線程進(jìn)行。例如圖像處理、視頻編碼、數(shù)據(jù)分析等。 基于多線程并發(fā)機(jī)制處理CPU密集型任務(wù)可以提高CPU
    的頭像 發(fā)表于 04-01 22:25 ?875次閱讀
    鴻蒙OS開(kāi)發(fā)實(shí)例:【ArkTS類庫(kù)<b class='flag-5'>多線程</b>CPU密集型任務(wù)TaskPool】

    鴻蒙APP開(kāi)發(fā):【ArkTS類庫(kù)多線程】TaskPool和Worker的對(duì)比

    TaskPool(任務(wù)池)和Worker的作用是為應(yīng)用程序提供一個(gè)多線程的運(yùn)行環(huán)境,用于處理耗時(shí)的計(jì)算任務(wù)或其他密集型任務(wù)。可以有效地避免這些任務(wù)阻塞主線程,從而最大化系統(tǒng)的利用率,降低整體資源消耗,并提高系統(tǒng)的整體性能。
    的頭像 發(fā)表于 03-26 22:09 ?690次閱讀
    鴻蒙APP開(kāi)發(fā):【ArkTS類庫(kù)<b class='flag-5'>多線程</b>】TaskPool和Worker的對(duì)比

    鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)多線程TaskPool和Worker的對(duì)比(一)

    TaskPool(任務(wù)池)和Worker的作用是為應(yīng)用程序提供一個(gè)多線程的運(yùn)行環(huán)境,用于處理耗時(shí)的計(jì)算任務(wù)或其他密集型任務(wù)。可以有效地避免這些任務(wù)阻塞主線程,從而最大化系統(tǒng)的利用率,降低整體資源消耗
    發(fā)表于 03-25 14:11

    鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)多線程I/O密集型任務(wù)開(kāi)發(fā)

    使用異步并發(fā)可以解決單次I/O任務(wù)阻塞的問(wèn)題,但是如果遇到I/O密集型任務(wù),同樣會(huì)阻塞線程中其它任務(wù)的執(zhí)行,這時(shí)需要使用多線程并發(fā)能力來(lái)進(jìn)行解決。 I/O密集型任務(wù)的性能重點(diǎn)通常不在于CPU的處理
    發(fā)表于 03-21 14:57

    java實(shí)現(xiàn)多線程的幾種方式

    Java實(shí)現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個(gè)或以上的線程,每個(gè)線程都可以并行執(zhí)行不同的任務(wù)或操作。Java中的多線程可以提高程序
    的頭像 發(fā)表于 03-14 16:55 ?771次閱讀

    python中5種線程鎖盤(pán)點(diǎn)

    線程安全是多線程或多進(jìn)程編程中的一個(gè)概念,在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會(huì)通過(guò)同步機(jī)制保證各個(gè)線程都可以正常且正確
    發(fā)表于 03-07 11:08 ?1650次閱讀
    python中5種<b class='flag-5'>線程</b>鎖盤(pán)點(diǎn)

    AT socket可以多線程調(diào)用嗎?

    請(qǐng)問(wèn)AT socket 可以多線程調(diào)用嗎? 有互鎖機(jī)制嗎,還是要自己做互鎖。
    發(fā)表于 03-01 08:22

    什么是多核多線程?多核多線程如何提高程序的運(yùn)行效率?

    線程無(wú)法充分利用多核處理器的并行計(jì)算能力。
    的頭像 發(fā)表于 02-20 10:22 ?1458次閱讀

    linux多線程編程實(shí)例

    linux線程
    的頭像 發(fā)表于 02-15 21:16 ?513次閱讀
    linux<b class='flag-5'>多線程</b>編程實(shí)例
    主站蜘蛛池模板: 亚洲精品蜜夜内射| 精品国产国产综合精品| 国产超碰AV人人做人人爽| 亚洲精品不卡在线| 亚洲视频91| 亚洲色欲色欲综合网站| 97国产精品人妻无码免费| 国产成人精品精品欧美| 久久91精品国产91| 热re99久久精品国99热| 日本工口生肉全彩大全| 青青青久久| 亚洲欧美日韩精品久久奇米色影视| 97精品国产亚洲AV超碰| 国产精品久久久久久久人热| 老师你下面好紧夹死了| 婷婷四房播客五月天| 3D漫画H精品啪啪无码| 国产精品人妻无码久久久奥特曼| 蜜臀AV久久国产午夜福利软件| 年轻的母亲4线在线观看完整| 天天躁人人躁人人躁狂躁| 正能量不良WWW免费窗口| 有人有片的观看免费视频| 成人a视频片在线观看免费| 第四色播日韩AV第一页| 国产成人综合高清在线观看| 久久性综合亚洲精品电影网| 私密按摩师在线观看 百度网盘| 亚洲AV无码专区国产精品麻豆| 99亚洲精品| 调教女M屁股撅虐调教| 久久久久久久久久毛片精品美女 | 欧美日韩888在线观看| 日本精品久久久久中文字幕| 亚洲一区成人| 国产精华av午夜在线观看| 牛牛在线1视频| 伊人国产在线播放| 国产精品网红女主播久久久| 噼里啪啦免费观看视频大全|