最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入多線程之:解析線程的交會(Thread Rendezvous)詳解

 更新時間:2013年05月14日 14:48:07   作者:  
本篇文章是對線程的交會(Thread Rendezvous)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

在上篇文章中我們使用了Wait和Pulse 實(shí)現(xiàn)了Countdown

接下來我們可以使用剛剛寫的Countdown 類來實(shí)現(xiàn)兩個線程的交會。

復(fù)制代碼 代碼如下:

class Rendezvous
    {
        static object _locker = new object();
        static Countdown _countdown = new Countdown(2);

        public static void MainThread()
        {
            Random r = new Random();
            new Thread(Mate).Start(r.Next(1000));
            Thread.Sleep(r.Next(10000)); //主線程睡眠一段時間

            _countdown.Singnal(); //向_countdown注冊信號,告知主線程已經(jīng)來了。
            _countdown.Wait();    //等待其他線程

            Console.WriteLine("Mate!");
        }

        static void Mate(object delay)
        {
            Thread.Sleep((int)delay);//線程睡眠。

            _countdown.Singnal(); //向_countdown注冊信號,告知線程已經(jīng)來了。
            _countdown.Wait();   //等待其他線程。

            Console.WriteLine("Mate!");

        }
}


就像小時候去春游一樣,這里的_countdown就是老師,線程就是學(xué)生。

學(xué)生A早上睡覺,然后起床來到交會點(diǎn),然后告訴老師,我來了,接著等待老師的出發(fā)命令,因?yàn)槔蠋熤烙袃蓚€學(xué)生要去春游,所以現(xiàn)在只來了一個,還有一個沒有來,所以老師會讓學(xué)生A等待,阻塞。

學(xué)生B也是睡覺,接著也來到交會點(diǎn),告訴老師,我也來了,然后等待老師的出發(fā)命令。

當(dāng)學(xué)生B告訴老師我來了的時候,此時老師的剩余等待學(xué)生計(jì)數(shù)為0,所以老師告訴這兩個學(xué)生,你們可以出發(fā)了。

.net framework 4.0 提供了Barrier 的構(gòu)造來實(shí)現(xiàn)線程交會的功能。如圖所示:

Thread1 調(diào)用SignalAndWait告知Barrier,我已經(jīng)來了,然后阻塞。

Thread3調(diào)用SignalAndWait告知Barrier,我已經(jīng)來了,然后阻塞。

Thread2 調(diào)用SignalAndWait告知Barrier,我已經(jīng)來了,Barrier知道現(xiàn)在三個線程都來了,所以讓他們繼續(xù)并發(fā)執(zhí)行。

Barrier的方法簡介:

    AddParticipants:增加參與者,也就是增加春游的人數(shù)。
    RemoveParticipant:減少參與者,可能某人肚子痛,不能參加春游了。
    SignalAndWait :參與者已經(jīng)來了,并等待其他參與者的到來。

下面是使用Barrier的示例:

復(fù)制代碼 代碼如下:

static Barrier _barrier = new Barrier(3);//說明有三個參與者

        public static void Main()
        {
            new Thread(Speak).Start();
            new Thread(Speak).Start();
            new Thread(Speak).Start();
        }

        static void Speak()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.Write(i + " ");
                _barrier.SignalAndWait(); //告知參與者已經(jīng)來了,等待其他參與者
            }
        }


輸出如下:

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4

Barrier 的另一個非常有用的特性是在每一個階段完成的時候你都可以執(zhí)行一個post-phase 的action委托。

什么是階段呢??,階段就是參與者全部都到了的時候。

如果我們修改Barrier的構(gòu)造函數(shù)如下:

static Barrier _barrier = new Barrier(3, (barrier) => Console.WriteLine());

//說明有三個參與者,并且每次三個參與者完成任務(wù)的時候執(zhí)行Console.WriteLine方法.

那么我們的輸出如下所示:

0 0 0

1 1 1

2 2 2

3 3 3

4 4 4

相關(guān)文章

  • C#實(shí)現(xiàn)員工ID卡的識別功能

    C#實(shí)現(xiàn)員工ID卡的識別功能

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)識別員工ID卡的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • Unity使用EzySlice實(shí)現(xiàn)模型多邊形順序切割

    Unity使用EzySlice實(shí)現(xiàn)模型多邊形順序切割

    這篇文章主要為大家詳細(xì)介紹了Unity使用EzySlice實(shí)現(xiàn)模型多邊形順序切割,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 解析abstract與override究竟可不可以同時使用

    解析abstract與override究竟可不可以同時使用

    本篇文章是對abstract與override究竟可不可以同時使用進(jìn)行了詳細(xì)分析介紹,需要的朋友參考下
    2013-05-05
  • c#編寫的番茄鐘倒計(jì)時器代碼

    c#編寫的番茄鐘倒計(jì)時器代碼

    番茄鐘是老外做飯用的一個廚具,比如蒸包子,水開后再蒸十分鐘,就把番茄鐘擰一下擰到10的刻度上,然后番茄鐘就嗒嗒嗒的慢慢歸位,等到十分鐘后完全歸位,然后就叮的響一聲,提醒老外把火關(guān)掉。
    2015-03-03
  • C#中Array與ArrayList用法及轉(zhuǎn)換的方法

    C#中Array與ArrayList用法及轉(zhuǎn)換的方法

    C#中Array與ArrayList用法及轉(zhuǎn)換的方法,需要的朋友可以參考一下
    2013-03-03
  • C# 正則表達(dá)式常用的符號和模式解析(最新推薦)

    C# 正則表達(dá)式常用的符號和模式解析(最新推薦)

    這篇文章主要介紹了C# 正則表達(dá)式常用的符號和模式解析,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • C#實(shí)現(xiàn)塊狀鏈表的項(xiàng)目實(shí)踐

    C#實(shí)現(xiàn)塊狀鏈表的項(xiàng)目實(shí)踐

    這篇文章主要介紹了C#實(shí)現(xiàn)塊狀鏈表的項(xiàng)目實(shí)踐,通過定義塊和鏈表類,利用塊內(nèi)元素引用實(shí)現(xiàn)塊與塊之間的鏈接關(guān)系,從而實(shí)現(xiàn)對塊狀鏈表的遍歷、插入和刪除等操作,感興趣的可以了解一下
    2023-11-11
  • C#職責(zé)鏈模式實(shí)例詳解

    C#職責(zé)鏈模式實(shí)例詳解

    這篇文章主要介紹了C#職責(zé)鏈模式,以實(shí)例形式完整分析了C#職責(zé)鏈模式的相關(guān)技巧與實(shí)現(xiàn)方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Unity實(shí)現(xiàn)場景加載功能

    Unity實(shí)現(xiàn)場景加載功能

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)場景加載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C#判斷指定分區(qū)是否是ntfs格式的方法

    C#判斷指定分區(qū)是否是ntfs格式的方法

    這篇文章主要介紹了C#判斷指定分區(qū)是否是ntfs格式的方法,涉及C#中DriveFormat屬性的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評論

南溪县| 辽源市| 荃湾区| 上蔡县| 贵溪市| 理塘县| 商河县| 清丰县| 宁武县| 贺兰县| 江川县| 靖边县| 广州市| 西丰县| 永仁县| 微山县| 普陀区| 报价| 温泉县| 沅江市| 扎鲁特旗| 玉屏| 舞钢市| 苗栗市| 仙桃市| 偏关县| 上饶市| 且末县| 巨鹿县| 宣威市| 宽城| 会昌县| 自贡市| 卓尼县| 陵川县| 桐乡市| 南乐县| 新密市| 武宁县| 彭泽县| 嫩江县|