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

首頁 > 編程 > C# > 正文

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

2020-01-24 03:19:53
字體:
來源:轉載
供稿:網友

在上篇文章中我們使用了Wait和Pulse 實現了Countdown

接下來我們可以使用剛剛寫的Countdown 類來實現兩個線程的交會。

復制代碼 代碼如下:

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注冊信號,告知主線程已經來了。
            _countdown.Wait();    //等待其他線程

            Console.WriteLine("Mate!");
        }

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

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

            Console.WriteLine("Mate!");

        }
}


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

學生A早上睡覺,然后起床來到交會點,然后告訴老師,我來了,接著等待老師的出發命令,因為老師知道有兩個學生要去春游,所以現在只來了一個,還有一個沒有來,所以老師會讓學生A等待,阻塞。

學生B也是睡覺,接著也來到交會點,告訴老師,我也來了,然后等待老師的出發命令。

當學生B告訴老師我來了的時候,此時老師的剩余等待學生計數為0,所以老師告訴這兩個學生,你們可以出發了。

.net framework 4.0 提供了Barrier 的構造來實現線程交會的功能。如圖所示:

Thread1 調用SignalAndWait告知Barrier,我已經來了,然后阻塞。

Thread3調用SignalAndWait告知Barrier,我已經來了,然后阻塞。

Thread2 調用SignalAndWait告知Barrier,我已經來了,Barrier知道現在三個線程都來了,所以讓他們繼續并發執行。

Barrier的方法簡介:

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

下面是使用Barrier的示例:

復制代碼 代碼如下:

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(); //告知參與者已經來了,等待其他參與者
            }
        }


輸出如下:

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

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

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

如果我們修改Barrier的構造函數如下:

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

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

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

0 0 0

1 1 1

2 2 2

3 3 3

4 4 4

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大渡口区| 磐安县| 当阳市| 吴忠市| 乐都县| 乌兰浩特市| 灵宝市| 乳山市| 文昌市| 兴义市| 景洪市| 天峻县| 尼勒克县| 鄯善县| 新丰县| 黄石市| 沽源县| 三门峡市| 赞皇县| 遂溪县| 苗栗市| 莲花县| 长沙市| 博罗县| 区。| 历史| 建阳市| 台南县| 白玉县| 淅川县| 安泽县| 大港区| 甘洛县| 长宁区| 酉阳| 巴林右旗| 长顺县| 马龙县| 铜川市| 普格县| 鹰潭市|