国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

淺解多線程(二)之和尚們的那些事兒

2019-11-17 03:09:44
字體:
來源:轉載
供稿:網(wǎng)友

淺解多線程(二)之和尚們的那些事兒

  • 淺解多線程(一)之線程入門起步

本文鏈接

  1. 確定多線程的結束時間,thread的IsAlive屬性
  2. 線程優(yōu)先級,thread的ThreadPRiority屬性
  3. 線程通信之Monitor類
  4. 線程排隊之Join
  5. 多線程互斥鎖Mutex
  6. 信號量semaphore

確定多線程的結束時間,thread的IsAlive屬性

在多個線程運行的背景下,了解線程什么時候結束,什么時候停止是很有必要的。

案例:老和尚念經(jīng)計時,2本經(jīng)書,2個和尚念,一人一本,不能撕破,最短時間念完,問老和尚們念完經(jīng)書最短需要多長時間。

分析:首先在開始念經(jīng)的時候給計時,記為A,最后在記下慢和尚念完經(jīng)書時的時間,記為B。求B-A

代碼:IsAlive屬性:標識此線程已啟動并且尚未正常終止或中止,則為 true,再念,沒念完,努力中;否則為 false,念完啦,歇著。

 //和尚1,和尚2        public Thread td1, td2;        public void StarThread()        {            //開啟一個線程執(zhí)行Hello方法,即和尚1念菠蘿菠蘿蜜            ThreadStart ts = new ThreadStart(Hello);            td1 = new Thread(ts);            td1.Start();        }        public void StarThread1()        {            //開啟一個線程執(zhí)行Welcome方法,即和尚2念大金剛經(jīng)            ThreadStart ts = new ThreadStart(Welcome);            td2 = new Thread(ts);            td2.Start();        }        public string sayh="", sayw="";        //菠蘿菠蘿蜜        public void Hello()        {            //念            sayh = "Hellow everyone ! ";        }        //大金剛經(jīng)        public  void Welcome()        {               //念            sayw = "Welcome to ShangHai ! ";            //偷懶10秒            Thread.Sleep(10000);        }        protected void btn_StarThread_Click(object sender, EventArgs e)        {            //記時開始,預備念                    Response.Write("開始念的時間: "+DateTime.Now.ToString() + "</br>");            //和尚1就位            StarThread();            //和尚2就位            StarThread1();            int i = 0;            while (i == 0)            {                //判斷線程的IsAlive屬性                //IsAlive標識此線程已啟動并且尚未正常終止或中止,則為 true;否則為 false。                //如果兩個都為false說明,線程結束終止                if (!td1.IsAlive && !td2.IsAlive)                {                    i++;                    if (i == 1)                    {                        //念得內(nèi)容,繞梁三尺。                        Response.Write("我們年的內(nèi)容: "+(sayh + " + " + sayw) + "</br>");                        Response.Write("念完時的時間: "+DateTime.Now.ToString());                        Response.End();                    }                }            }        }

線程優(yōu)先級,thread的ThreadPriority屬性

線程優(yōu)先級區(qū)別于線程占有cpu時間的多少,當然優(yōu)先級越高同等條件下占有的cpu時間越多。級別高的執(zhí)行效率要高于級別低的。

優(yōu)先級有5個級別:Lowest<BelowNormal<Normal<AboveNormal<Highest;默認為Normal。

案例:老和尚娶媳婦。佛祖說:你們3個和尚,清修刻苦,現(xiàn)特許你們?nèi)⑾眿D啦,不過娶媳婦的只能是你們?nèi)齻€中間的一人。條件是我手中的經(jīng)書誰能先念完,誰可以娶。

分析:和尚平時都很刻苦,各有特點,平時和尚1在lowest環(huán)境下念經(jīng),和尚2在normal環(huán)境下念經(jīng),和尚3在Highest環(huán)境下念經(jīng)。

 protected void btn_StarThread_Click(object sender, EventArgs e)        {            Write();        }        //i為和尚1念的頁數(shù)        //j為和尚2念的頁數(shù)        //k為和尚3念的頁數(shù)        //c為經(jīng)書總頁數(shù)        int i=0,j=0,k=0,c=10000000;        //和尚1念經(jīng)        public void Jsi()        {            while (i <= c)            {                i+=1;            }        }        //和尚2念經(jīng)        public void Jsj()        {            while (j <= c)            {                j+=1;            }        }        //和尚3念經(jīng)        public void Jsk()        {            while (k <= c)            {                k+=1;            }        }        public void Write()        {            //開啟線程計算i            ThreadStart sti = new ThreadStart(Jsi);            Thread tdi = new Thread(sti);            //設置線程優(yōu)先級為Lowest。和尚1在Lowest環(huán)境下念經(jīng)            tdi.Priority = ThreadPriority.Lowest;            //開啟線程計算j            ThreadStart stj = new ThreadStart(Jsj);            Thread tdj = new Thread(stj);            //設置線程優(yōu)先級為Normal。和尚2在Normal環(huán)境下念經(jīng)            tdj.Priority = ThreadPriority.Normal;                        //開啟線程計算k            ThreadStart stk = new ThreadStart(Jsk);            Thread tdk = new Thread(stk);            //設置線程優(yōu)先級為Highest。和尚3在Highest環(huán)境下念經(jīng)            tdk.Priority = ThreadPriority.Highest;                                 //開始            tdj.Start();            tdk.Start();            tdi.Start();            int s = 0;            while (s==0)            {                                if (k > c)                {                    s++;                    Response.Write("比賽結束,結果如下:</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.End();                }            }        }

為啦方便期間,從這以后,我要用控制臺程序演示,操控線程。

線程通信之Monitor類

如果,你的線程A中運行鎖內(nèi)方法時候,需要去訪問一個暫不可用資源B,可能在B上需耗費很長的等待時間,那么這時候你的線程A,將占用鎖內(nèi)資源,阻塞其它線程訪問鎖定內(nèi)容,造成性能損失。你該怎么解決這樣子的問題呢?這樣,讓A暫時放棄鎖,停留在鎖中的,允許其它線程訪問鎖,而等B資源可用時,通知A讓他繼續(xù)鎖內(nèi)的操作。是不是解決啦問題,這樣就用到啦這段中的Monitor類,提供的幾個方法:Wait(),Pulse(),PulseAll(),這幾個方法只能在當前鎖定中使用。

Wait():暫時中斷運行鎖定中線程操作,釋放鎖,時刻等待著通知復活。

Pulse():通知等待該鎖線程隊列中的第一個線程,此鎖可用。

PulseAll():通知所有鎖,此鎖可用。

案例:嵩山少林和尚開會。主持人和尚主持會議會不停的上舞臺講話,方丈會出來宣布大會開始,弟子們開始討論峨眉山怎么走。

分析:主持人一個線程,方丈一個線程,弟子們一個線程,主持人貫徹全場。

 public class MutexSample    {        static void Main()        {            comm com = new comm();            com.dhThreads();            Console.ReadKey();        }    }    public class comm    {        //狀態(tài)值:0時主持人和尚說,1時方丈說,2時弟子們說,3結束。        int sayFla;        //主持人上臺        int i = 0;        public void zcrSay()        {            lock (this)            {                string sayStr;                if (i == 0)                {                    //讓方丈說話                    sayFla = 1;                    sayStr = Thread.CurrentThread.Name+"今晚,陽光明媚,多云轉晴,方丈大師,程祥云而來,傳揚峨眉一隅,情況如何,還請方丈閃亮登場。";                    Console.WriteLine(sayStr);                    i++;                    //此時sayFla=1通知等待的方丈線程運行                    Monitor.Pulse(this);                      //暫時鎖定主持人,暫停到這里,釋放this讓其它線程訪問                    Monitor.Wait(this);                                    }                //被通知后,從上一個鎖定開始運行到這里                if (i == 1)                {                    //讓弟子說話                    sayFla = 2;                    sayStr = Thread.CurrentThread.Name + "看方丈那幸福的
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 瑞丽市| 开封市| 英德市| 横山县| 肇源县| 白玉县| 调兵山市| 苏尼特右旗| 滦南县| 贡嘎县| 手游| 凉城县| 福清市| 措勤县| 奇台县| 丽水市| 定南县| 上饶县| 塔城市| 思茅市| 南宁市| 平湖市| 文成县| 阿拉善左旗| 天气| 洛扎县| 上饶县| 米易县| 安福县| 寿光市| 缙云县| 孙吴县| 元谋县| 张家界市| 共和县| 兖州市| 图们市| 乐陵市| 玛曲县| 北京市| 阜平县|