欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

復(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)); //主線程睡眠一段時(shí)間

            _countdown.Singnal(); //向_countdown注冊(cè)信號(hào),告知主線程已經(jīng)來(lái)了。
            _countdown.Wait();    //等待其他線程

            Console.WriteLine("Mate!");
        }

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

            _countdown.Singnal(); //向_countdown注冊(cè)信號(hào),告知線程已經(jīng)來(lái)了。
            _countdown.Wait();   //等待其他線程。

            Console.WriteLine("Mate!");

        }
}


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

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

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

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

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

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

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

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

Barrier的方法簡(jiǎn)介:

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

下面是使用Barrier的示例:

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

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

        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)來(lái)了,等待其他參與者
            }
        }


輸出如下:

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

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

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

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

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

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

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

0 0 0

1 1 1

2 2 2

3 3 3

4 4 4

相關(guān)文章

  • 淺談c#.net中巧用ToString()將日期轉(zhuǎn)成想要的格式

    淺談c#.net中巧用ToString()將日期轉(zhuǎn)成想要的格式

    有時(shí)候我們要對(duì)時(shí)間進(jìn)行轉(zhuǎn)換,達(dá)到不同的顯示效果,更多的該怎么辦呢?
    2013-03-03
  • 淺談二叉查找樹的集合總結(jié)分析

    淺談二叉查找樹的集合總結(jié)分析

    本篇文章是談二叉查找樹進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友參考下
    2013-05-05
  • C# Lambda 知識(shí)回顧

    C# Lambda 知識(shí)回顧

    本文主要介紹了C#中Lambda的相關(guān)知識(shí)。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • c#異步task示例分享(異步操作)

    c#異步task示例分享(異步操作)

    這篇文章主要介紹了c#異步task示例(異步操作),需要的朋友可以參考下
    2014-03-03
  • C#使用Exchange實(shí)現(xiàn)發(fā)送郵件

    C#使用Exchange實(shí)現(xiàn)發(fā)送郵件

    最近項(xiàng)目中需要用到exchange的操作,所以本文就參照msdn弄了一個(gè)簡(jiǎn)單的C#操作類,實(shí)現(xiàn)了發(fā)送郵件和拉取收件箱的功能,感興趣的小伙伴可以了解下
    2023-10-10
  • C#中Random.Next方法的使用小結(jié)

    C#中Random.Next方法的使用小結(jié)

    在C#中,Random.Next()方法用于生成一個(gè)隨機(jī)整數(shù),本文主要介紹了C#中Random.Next方法的使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C#執(zhí)行DOS命令的方法

    C#執(zhí)行DOS命令的方法

    這篇文章主要介紹了C#執(zhí)行DOS命令的方法,涉及針對(duì)進(jìn)程的調(diào)用以及系統(tǒng)DOS命令的使用,具有不錯(cuò)的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-11-11
  • C#程序提示“正由另一進(jìn)程使用,因此該進(jìn)程無(wú)法訪問(wèn)該文件”的解決辦法

    C#程序提示“正由另一進(jìn)程使用,因此該進(jìn)程無(wú)法訪問(wèn)該文件”的解決辦法

    這篇文章主要介紹了C#程序提示“正由另一進(jìn)程使用,因此該進(jìn)程無(wú)法訪問(wèn)該文件”的解決辦法,本文通過(guò)改寫程序代碼實(shí)現(xiàn)解決這個(gè)問(wèn)題,需要的朋友可以參考下
    2015-06-06
  • 最新評(píng)論