多线程编程(9)Barrier

news/2024/7/7 16:40:34

 

魔兽世界组队下副本

下副本一般都要找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

转载于:https://www.cnblogs.com/Clingingboy/archive/2010/11/19/1881593.html


http://www.niftyadmin.cn/n/3297544.html

相关文章

php ldap扩展无法启动,Ubuntu 安装PHP的LDAP扩展时遇到的问题以及解决方案

运行环境:Ubuntu 15.04PHP 5.5.19安装PHP的扩展LDAP,按往常习惯,先phpize,再configure,先是碰到下面这个问题:configure: error: Cannot find ldap libraries in /usr/lib然后我用apt-cache search ldap | …

关系图:Linux演化图,Ubuntu应用图

Ubuntu应用图: http://hustslb.blog.163.com/blog/static/145706216201010198521555/ Linux演化图两张: http://hustslb.blog.163.com/blog/static/1457062162010101984814156/ 转载于:https://www.cnblogs.com/dartagnan/archive/2010/11/19/20…

spring 事务日志

事务方法日志: reating new transaction with name ]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-ExceptionAcquired Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl1ff05076] for JDBC transactionSwitching JDBC Connection [com.alibaba.druid.p…

php获取今天及明天开始时间,PHP获取昨天、今天及明天日期的方法,php获取_PHP教程...

PHP获取昨天、今天及明天日期的方法,php获取本文实例讲述了PHP获取昨天、今天及明天日期的方法。分享给大家供大家参考,具体如下://PHP返回昨天的日期function get_last_date() {$tomorrow mktime(0,0,0,date("m"),date("d&q…

c#截取字符串指定符号,在.NET中,C#字符串是可截取的,可从指定位置截取,也可指定数量...

C#核心开发-第16单元-字符串-第2节:截取字符串C#核心开发-截取字符串1. 什么是截取字符串?截取字符串是指在一个比较长的字符串中截取一部分有用、有意义的子字符串。在C#中,可以使用Substring()方法在字符串中截取子字符串,可以从…

.NET中GridView控件的全选删除

1.首先要在你的GridView的HeaderTemplate项模版里放一个HTML工具栏里的checkbox控件(注意:这里所说的不是标准里边的服务器控件)并在这个控件的onclick事件中调用步骤2里边的函数方法,也就是οnclick"CheckAll(this)"这里边的this就是这个控件的本身,然后…

Python初尝试

Python 从去年就下了一些资料打算开始学习的,可是到现在才真正的开始,在这段时间发生了蛮多事情的,也经历了一些,现在差不多找到自己的方向和位置的了,喜欢自由就按照自己喜欢的去做去学习就好了. 今天就把python的环境…

处理2D图像和纹理——显示文字

问题 你想绘制一些文字,例如,显示一些操作说明或当前得分。 解决方案 本章前四个教程中学习的SpriteBatch类也可以绘制文字。做法和绘制纹理几乎是一样的,只不过不是导入一个Texture2D,这次导入的是一个SpriteFont,它包…