亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

接下來我們可以使用剛剛寫的Countdown 類來實現(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早上睡覺,然后起床來到交會點,然后告訴老師,我來了,接著等待老師的出發(fā)命令,因為老師知道有兩個學(xué)生要去春游,所以現(xiàn)在只來了一個,還有一個沒有來,所以老師會讓學(xué)生A等待,阻塞。

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

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

.net framework 4.0 提供了Barrier 的構(gòu)造來實現(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#.net中巧用ToString()將日期轉(zhuǎn)成想要的格式

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

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

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

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

    C# Lambda 知識回顧

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

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

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

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

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

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

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

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

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

    C#程序提示“正由另一進程使用,因此該進程無法訪問該文件”的解決辦法

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