版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
淺解多線程(二)之和尚們的那些事兒淺解多線程(一)之線程入門起步[本文鏈接確定多線程的結(jié)束時間,thread的IsAlive屬性線程優(yōu)先級,thread的ThreadPriority屬性線程通信之Monitor類線程排隊(duì)之Join多線程互斥鎖Mutex信號量semaphore確定多線程的結(jié)束時間,thread的IsAlive屬性在多個線程運(yùn)行的背景下,了解線程什么時候結(jié)束,什么時候停止是很有必要的。案例:老和尚念經(jīng)計(jì)時,2本經(jīng)書,2個和尚念,一人一本,不能撕破,最短時間念完,問老和尚們念完經(jīng)書最短需要多長時間。分析:首先在開始念經(jīng)的時候給計(jì)時,記為A,最后在記下慢和尚念完經(jīng)書時的時間,記為B。求B-A代碼:IsAlive屬性:標(biāo)識此線程已啟動并且尚未正常終止或中止,則為true,再念,沒念完,努力中;否則為false,念完啦,歇著。//和尚1,和尚2publicThreadtd1,td2;publicvoidStarThread(){//開啟一個線程執(zhí)行Hello方法,即和尚1念菠蘿菠蘿蜜ThreadStartts=newThreadStart(Hello);td1=newThread(ts);td1.Start();}publicvoidStarThread1(){//開啟一個線程執(zhí)行Welcome方法,即和尚2念大金剛經(jīng)ThreadStartts=newThreadStart(Welcome);td2=newThread(ts);td2.Start();}publicstringsayh二,sayw=;//菠蘿菠蘿蜜publicvoidHello(){
//念sayh=""Helloweveryone!"";}//大金剛經(jīng)publicvoidWelcomeO{//念sayw="WelcometoShangHai!"";//偷懶10秒Thread.Sleep(lOOOO);}protectedvoidbtn_StarThread_Click(objectsender,EventArgse){//記時開始,預(yù)備念Response.Write(〃開始念的時間:〃+DateTime.Now.ToString()+〃</br>〃);//和尚1就位StarThread();//和尚2就位StarThread1();inti二0;while(i==0){//判斷線程的IsAlive屬性//IsAlive標(biāo)識此線程已啟動并且尚未正常終止或中止,則為true;否則為false。//如果兩個都為false說明,線程結(jié)束終止if(!tdl.IsAlive&&!td2.IsAlive){i++;if(i==1){//念得內(nèi)容,繞梁三尺。Response.Write(〃我們年的內(nèi)容:〃+(sayh+"+“+sayw)+〃</br>〃);Response.Write(〃念完時的時間:〃+DateTime.Now.ToString());Response.EndO;}}}}
線程優(yōu)先級,thread的ThreadPriority屬性線程優(yōu)先級區(qū)別于線程占有cpu時間的多少,當(dāng)然優(yōu)先級越高同等條件下占有的cpu時間越多。級別咼的執(zhí)彳丁效率要咼于級別低的。優(yōu)先級有5個級別:Lowest〈BelowNormal<Normal<AboveNormal<Highest;默認(rèn)為Normal。案例:老和尚娶媳婦。佛祖說:你們3個和尚,清修刻苦,現(xiàn)特許你們?nèi)⑾眿D啦,不過娶媳婦的只能是你們?nèi)齻€中間的一人。條件是我手中的經(jīng)書誰能先念完,誰可以娶。分析:和尚平時都很刻苦,各有特點(diǎn),平時和尚1在lowest環(huán)境下念經(jīng),和尚2在normal環(huán)境下念經(jīng),和尚3在Highest環(huán)境下念經(jīng)。protectedvoidbtn_StarThread_Click(objectsender,EventArgse){Write();}//i為和尚1念的頁數(shù)//j為和尚2念的頁數(shù)//k為和尚3念的頁數(shù)//c為經(jīng)書總頁數(shù)inti=O,j=O,k=O,c=1OOOOOOO;//和尚1念經(jīng)publicvoidJsi(){while(i<=c){i+=1;}}//和尚2念經(jīng)publicvoidjsj(){
while(j<=c){j+=l;}}//和尚3念經(jīng)publicvoidjsk(){while(k<=c){k+=1;}}publicvoidWrite(){//開啟線程計(jì)算iThreadstartsti二newThreadStart(Jsi);Threadtdi=newThread(sti);//設(shè)置線程優(yōu)先級為Lowest。和尚1在Lowest環(huán)境下念經(jīng)tdi. Priority二ThreadPriority.Lowest;//開啟線程計(jì)算jThreadStartstj=newThreadStart(Jsj);Threadtdj=newThread(stj);//設(shè)置線程優(yōu)先級為Normal。和尚2在Normal環(huán)境下念經(jīng)tdj. Priority二ThreadPriority.Normal;//開啟線程計(jì)算kThreadStartstk=newThreadStart(Jsk);Threadtdk=newThread(stk);//設(shè)置線程優(yōu)先級為Highest。和尚3在Highest環(huán)境下念經(jīng)tdk. Priority二ThreadPriority.Highest;//開始tdj.Start();tdk.Start();tdi.Start();ints=0;while(s==0){if(k>c){s++;Response.Write("比賽結(jié)束,結(jié)果如下:</br></br>");
Response.Write("和尚1在Lowest環(huán)境下念經(jīng):"+i+"頁</br>和尚2在Normal環(huán)境下念經(jīng):"+j+"頁</br>和尚3在Highest環(huán)境下念經(jīng):"+k+"頁</br></br>");Response.Write(〃佛祖又說:你念或者不念,蒼老師,就在那里!");Response.EndO;}}}/團(tuán)斟蒐i圍淺噩菲£匾圖氈..口I為"〈圈博擁托勺-CfftDIocalhost:45719/gggtfc先級.aspx比賽結(jié)束,結(jié)里如下?利尚1在Lcwwt環(huán)境下念璽:123駆頁和尚2吞N(yùn)orinalJ^境宅念經(jīng):75636.91頁和證在Highwt環(huán)撇卞急經(jīng):10000001頁?怫祖又說;你念或者不念,蒼老師,就在那里!為啦方便期間,從這以后,我要用控制臺程序演示,操控線程。線程通信之Monitor類如果,你的線程A中運(yùn)行鎖內(nèi)方法時候,需要去訪問一個暫不可用資源B,可能在B上需耗費(fèi)很長的等待時間,那么這時候你的線程A,將占用鎖內(nèi)資源,阻塞其它線程訪問鎖定內(nèi)容,造成性能損失。你該怎么解決這樣子的問題呢?這樣,讓A暫時放棄鎖,停留在鎖中的,允許其它線程訪問鎖,而等B資源可用時,通知A讓他繼續(xù)鎖內(nèi)的操作。是不是解決啦問題,這樣就用到啦這段中的Monitor類,提供的幾個方法:Wait(),Pulse(),PulseAll(),這幾個方法只能在當(dāng)前鎖定中使用。Wait():暫時中斷運(yùn)行鎖定中線程操作,釋放鎖,時刻等待著通知復(fù)活。PulseO:通知等待該鎖線程隊(duì)列中的第一個線程,此鎖可用。PulseAll():通知所有鎖,此鎖可用。案例:嵩山少林和尚開會。主持人和尚主持會議會不停的上舞臺講話,方丈會出來宣布大會開始,弟子們開始討論峨眉山怎么走。分析:主持人一個線程,方丈一個線程,弟子們一個線程,主持人貫徹全場。publicclassMutexSample{staticvoidMain(){commcom=newcomm();com.dhThreads();Console.ReadKeyO;}
publicclasscomm{//狀態(tài)值:0時主持人和尚說,1時方丈說,2時弟子們說,3結(jié)束。intsayFla;//主持人上臺inti二0;publicvoidzcrSayO{lock(this){stringsayStr;if(i==0){//讓方丈說話sayFla=1;sayStr二Thread.CurrentThread.Name+"今晚,陽光明媚,多云轉(zhuǎn)晴,方丈大師,程祥云而來,傳揚(yáng)峨眉一隅,情況如何,還請方丈閃亮登場?!?;Console.WriteLine(sayStr);i++;//此時sayFla=1通知等待的方丈線程運(yùn)行Monitor.Pulse(this);//暫時鎖定主持人,暫停到這里,釋放this讓其它線程訪問Monitor.Wait(this);}//被通知后,從上一個鎖定開始運(yùn)行到這里if(i==1){//讓弟子說話sayFla=2;sayStr=Thread.CurrentThread.Name+〃看方丈那幸福的表情,徜徉肆恣,愿走的跟他去吧。下面請弟子們各抒己見〃;Console.WriteLine(sayStr);i++;//此時sayFla=12通知等待的弟子線程運(yùn)行Monitor.Pulse(this);//暫時鎖定主持人,暫停到這里,釋放this讓其它線程訪問Monitor.Wait(this);}//被通知后,從上一個鎖定開始運(yùn)行到這里if(i==2)sayFla=3;
sayStr=Thread.CurrentThread.Name+"大會結(jié)束!方丈幸福?。∩n老師你在哪里??。》砰_那女孩???〃;Console.WriteLine(sayStr);i++;Monitor.Wait(this);}}}//方丈上臺publicvoidfzSayO{lock(this){while(true){if(sayFla!=1){Monitor.Wait(this);}if(sayFla==1){Console.WriteLine(Thread.CurrentThread.Name+〃藍(lán)藍(lán)的天空,綠綠的湖水,我看見,咿呀呀呀,看見一老尼,咿呀呀,在水一方。愿意來的一起來,不愿來的蒼老師給你們放寺里。。咿呀呀,我走啦。。?!?;//交給主持人sayFla=0;//通知主持人線程,this可用Monitor.Pulse(this);}}}}//弟子上臺publicvoiddzSay(){lock(this){while(true){if(sayFla!=2){Monitor.Wait(this);}if(sayFla==2)
{Console.WriteLine(Thread.CurrentThread.Name+"果真如此的話,還是方丈大師自己去吧??!祝福啊....");//交給主持人sayFla=0;Monitor.Pulse(this);}}}}publicvoiddhThreads(){ThreadzcrTd=newThread(newThreadStart(zcrSay));ThreadfzTd=newThread(newThreadStart(fzSay));ThreaddzTd=newThread(newThreadStart(dzSay));zcrTd.Name="主持人:";fzTd.Name="方丈:";dzTd.Name="弟子:";zcrTd.Start();fzTd.Start();dzTd.Start();}}寺星?!?巾見,.囲爭呀呀呀,看見一老尼.晦呀呀,在水一方<— 呀,我走DfioOO慾「慮走的踉祂去吧.下面請弟子捫各抒己見三去吧?。∽80?…寺星?!?巾見,.囲爭呀呀呀,看見一老尼.晦呀呀,在水一方<— 呀,我走DfioOO慾「慮走的踉祂去吧.下面請弟子捫各抒己見三去吧!!祝福啊?…■1^"J £ rfnnm宀i■ _5_Jii-nmI-3_1_王'愿「給徜大!水師,丈!Sisi■福蕃的釘。綠IR話!-■llx^rl刁哥白目矍天,丈此結(jié)詈的害如會7閃藍(lán)起看真大:丈配一;異:八方.?的人:人〔請丈球持了拾工還力意王^線程排隊(duì)之Join多線程,共享一個資源,先后操作資源。Join()方法,暫停當(dāng)前線程,直到指定線程運(yùn)行完畢,才喚醒當(dāng)前線程。如果沒有Join,多線程隨機(jī)讀取公用資源,沒有先后次序。案例:兩個和尚念一本經(jīng)書,老和尚年前半本書,小和尚念后半本書,小和尚調(diào)皮,非要先念,就給老和尚用迷魂藥啦。。分析:一本書6頁,小和尚4-6,老和尚1-3,兩個和尚,兩個線程。publicclass連接線程Join{//小和尚publicstaticThreadlitThread;//老和尚
publicstaticThreadoldThread;//老和尚念經(jīng)staticvoidoldRead(){//老和尚被小和尚下藥litThread.Join();//暫停oldThread線程,開始litThread,直到litThread線程結(jié)束,oldThread才繼續(xù)運(yùn)行,如果不適用Join將小和尚一句,老和尚一句,隨即沒有規(guī)則的。for(inti二1;i〈二3;i++){Console.WriteLine(i);}}//小和尚念經(jīng)staticvoidlitRead(){for(inti二4;i<=6;i++){Console.WriteLine(i);}}staticvoidMain(string[]args){oldThread=newThread(newThreadStart(oldRead));litThread=newThread(newThreadStart(litRead));oldThread.Start();//FristThread.Join(); //暫停oldThread線程,開始litThread,直到litThread線程結(jié)束,oldThread才繼續(xù)運(yùn)行l(wèi)itThread.Start();Console.ReadKeyO;}}多線程互斥鎖Mutex
互斥鎖是一個同步的互斥對象,適用于,一個共享資源,同時只能有一個線程能夠使用。共享資源加互斥鎖,需要兩部走:I.WaitOne(),他將處于等待狀態(tài)知道可以獲取資源上的互斥鎖,獲取到后,阻塞主線程運(yùn)行,直到釋放互斥鎖結(jié)束°2.ReleaseMutex(),釋放互斥鎖,是其它線程可以獲取該互斥鎖。案例:和尚寫日記。最近寺廟香火不旺,為啦節(jié)約用水,方丈發(fā)話兩個和尚用一個本子寫日記。分析:好比多個線程寫日志,同時只能有一個線程寫入日志文件。publicclass多線程互斥鎖Mutex{staticvoidMain(string[]args){IncThreadict=newIncThread(“大和尚",3);DecThreaddct=newDecThread(“小和尚",3);Console.ReadKeyO;}}classSharedRes{publicstaticintcount二0;//初始化互斥鎖,沒被獲取publicstaticMutexmtx=newMutex();////初始化互斥鎖,被主調(diào)線程獲取//publicstaticMutexmtx=newMutex(true);}classIncThread{intnum;publicThreadthrd;publicIncThread(stringname,intn){thrd=newThread(newThreadStart(this.run));thrd.Name=name;num=n;thrd.Start();}//寫日記,過程voidrun(){Console.WriteLine(thrd.Name+",等待互斥鎖。");SharedRes.mtx.WaitOne();Console.WriteLine(thrd.Name+",獲得互斥鎖。");
do{Thread.Sleep(500);SharedRes.count++;Console.WriteLine("今天我"+thrd.Name+"比較強(qiáng),這樣寫吧:"+SharedRes.count);num——;}while(num>0);Console.WriteLine(thrd.Name+",釋放互斥鎖。");SharedRes.mtx.ReleaseMutex();}}classDecThread{intnum;publicThreadthrd;publicDecThread(stringname,intn){thrd=newThread(newThreadStart(this.run));thrd.Name=name;num=n;thrd.Start();}//寫日記,過程voidrun(){Console.WriteLine(thrd.Name+",等待互斥鎖。");SharedRes.mtx.WaitOne();Console.WriteLine(thrd.Name+",獲得互斥鎖。");do{Thread.Sleep(500);SharedRes.count--;Console.WriteLine("今天我"+thrd.Name+"比較衰,這樣寫吧:"+SharedRes.count);num——;}while(num>0);Console.WriteLine(thrd.Name+",釋放互斥鎖。");SharedRes.mtx.ReleaseMutex();}}
misif8is尚尚尚-nnn--吧吧吧Jmisif8is尚尚尚-nnn--吧吧吧J--_J-■-J---WW1'這這這吧吧吧■■--■J---J-■-這這這:2:1:9信號量semaphore類似于互斥鎖,只不過他可以指定多個線程來訪問,共享資源。在初始化信號量的同時,指定多少個線程可以訪問,假如允許2個線程訪問,而卻有3個線程等待訪問,那么他將只允許2個訪問,一旦已訪問的2個線程中有一個訪問完成釋放信號量,那么沒有訪問的線程立馬可以進(jìn)入訪問。案例:和尚抓雞,3個和尚抓雞,只有兩只雞,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 溝通的課件教學(xué)課件
- 2024年廣告資源銷售合同文本
- 2024年度合作經(jīng)營咖啡館之合伙協(xié)議書
- 模擬法庭課件教學(xué)課件
- 課件帶語音教學(xué)課件
- 2024商場美食廣場保險(xiǎn)服務(wù)合同
- 2024【工商局業(yè)務(wù)表格格式條款備案申請書】工商局合同格式條款整治工作方案
- 2024年度噸不銹鋼帶打印功能電子地磅秤生產(chǎn)批次檢驗(yàn)合同
- 04道路交通事故賠償合同
- 2024房產(chǎn)借款抵押合同樣本
- 國開電大《農(nóng)村社會學(xué)》形成考核1答案
- 個人理財(cái)課程房產(chǎn)規(guī)劃課件
- 混凝土澆筑及振搗措施方案
- 《思想道德與法治》 課件 第四章 明確價值要求 踐行價值準(zhǔn)則
- 施工現(xiàn)場消防安全驗(yàn)收表(總平面布置)
- 小學(xué)數(shù)學(xué)教師家長會ppt
- 君子自強(qiáng)不息課件
- 2022人教版高二英語新教材選擇性必修全四冊課文原文及翻譯(英漢對照)
- WDZANYJY23低壓電力電纜技術(shù)規(guī)格書
- 抗高血壓藥物基因檢測課件
- 醫(yī)院管理醫(yī)院應(yīng)急調(diào)配機(jī)制
評論
0/150
提交評論