多线程编程(9)Barrier

 

魔兽世界组队下副本

下副本一般都要找5个人,一般玩家都在副本门口等,然后等待其他玩家跑过来

即玩家在做两个动作

1.跑到副本门口

2.等5个人到齐了,然后进副本.

如果玩家先到就得等其他玩家到了才可以下副本,即大家跑到副本门口的时间是不同的,但进副本的时间是相同的(保持线程同步).

示例代码如下

public class Demo6
{
    Barrier barrier=new Barrier(5);
    public Demo6()
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(Task1));
        ThreadPool.QueueUserWorkItem(new WaitCallback(Task2));
        ThreadPool.QueueUserWorkItem(new WaitCallback(Task3));
        ThreadPool.QueueUserWorkItem(new WaitCallback(Task4));
        ThreadPool.QueueUserWorkItem(new WaitCallback(Task5));
    }

    public void Task1(object obj)
    {
        Thread.Sleep(1000);
        Console.WriteLine(DateTime.Now);
        Console.WriteLine("Task1");
        barrier.SignalAndWait();
        Console.WriteLine("Task1 DoConcurrent");
    }

    public void Task2(object obj)
    {
        Thread.Sleep(2000);
        Console.WriteLine(DateTime.Now);
        Console.WriteLine("Task2");
        barrier.SignalAndWait();
        Console.WriteLine("Task2 DoConcurrent");
    }

    public void Task3(object obj)
    {
        Thread.Sleep(3000);
        Console.WriteLine(DateTime.Now);
        Console.WriteLine("Task3");
        barrier.SignalAndWait();
        Console.WriteLine("Task3 DoConcurrent");
    }

    public void Task4(object obj)
    {
        Thread.Sleep(4000);
        Console.WriteLine(DateTime.Now);
        Console.WriteLine("Task4");
        barrier.SignalAndWait();
        Console.WriteLine("Task4 DoConcurrent");
    }

    public void Task5(object obj)
    {
        Thread.Sleep(5000);
        Console.WriteLine(DateTime.Now);
        Console.WriteLine("Task5");
        barrier.SignalAndWait();
        Console.WriteLine("Task5 DoConcurrent");
    }
}

结果

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值