C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现
上司交代要做一个小测试
具体的需求是 在某一时间点,只有N个线程在并发执行,如果有多余的线程,则排队等候~
还真是费尽心思啊~最终还是被我攻克了~
下面我就来说说具体的实现
C#提供了Mutex与Interlocked这两个与线程相关的类,都在Threading命名空间下~!
Mutex中提供了WiteOne,ReleaseMutex 两个实例方法~
WiteOne的作用是"阻塞当前线程,提供对该线程的原子操作"
也就是说当一个线程遇到WiteOne的时候,如果在WiteOne里面没有线程在操作,则此线程进去操作
而里面有线程的时候,所有到此的线程均需要排队等候里面的线程执行完毕~
而控制这样操作的结束标记就是使用ReleaseMutex 方法!
就好比WiteOne是一把锁一样~而ReleaseMutex 就是一把钥匙
当10个人都看到这个门的时候,第一个到达门口的人会看到屋子里没有人,则他进去,同时会把门锁上~
后面的人自然要在门口等候,当此人在屋子里执行完任务后他会用钥匙把门打开!
出去后把锁交给门口排队的第二位同志,第二位同志再做同样的操作
如果第一位同志执行完任务以后不把使用权交给第二个人的话,而直接退出
那么屋子自然就空了下来,而门还是锁的~不必担心~门会自动打开,只要是前一个人已经不在屋子里即可~
然后再来说说这个Interlocked,官方说明是"对一个变量进行原子操作进行递增或者递减然后保存"
原子操作的概念就是,有且只有一个线程在对此变量进行操作~不准其他线程干预的操作
当对一个变量进行原子操作的时候,此变量就会加锁,而其他线程是无法访问的,只能挂起等候此变量解锁
我感觉实际上使用的也就是Mutex来实现的
好了开始说说具体的实现吧
public class MutexTest
{
private static int poolFlag = 0 ;//标记
private const int amountThread = 10 ;//线程总量
private const int maxThread = 3 ;//可执行线程最大数量
private static Mutex muxConsole = new Mutex() ;
public static void Main()
{
for ( int i = 0 ; i < amountThread ; i ++ )
{
// 创建指定数量的线程
// 是线程调用Run方法
// 启动线程
Thread trd = new Thread( new ThreadStart( Run ) ) ;
trd.Name = "线程" + i ;
trd.Start() ;
}
}
public static void Run()
{
muxConsole.WaitOne(); //阻塞队列
Interlocked.Increment(ref poolFlag) ; //标记+1
if (poolFlag != maxThread) //判断是否等于上限
muxConsole.ReleaseMutex(); //如果此线程达不到可执行线程上限,则继续开通,让后面的线程进来
Console.WriteLine( "{0} 正在运行......\n", Thread.CurrentThread.Name ) ;
Thread.Sleep( 5000 ); //模拟执行
Console.WriteLine( "{0} 已经中止......\n", Thread.CurrentThread.Name ) ;
//标记-1
Interlocked.Decrement(ref poolFlag) ;
}
}
注释很全,大家慢慢看吧~我准备把这个用到WebService的负载平衡上面~
这样我就可以自己控制请求的数量了~
- · Autodesk官方最新的.NET教程(一)(C#版)
- · 发掘 C# 特性赋予科学计算项目以威力
- · C#技术内幕 学习笔记
- · C#连接ACCESS和SQL2000
- · 利用c#制作简单的留言板(4)
- · 利用c#制作简单的留言板(3)
- · 利用c#制作简单的留言板(2)
- · 利用c#制作简单的留言板(1)
- · 在C#中导入WebBrowser控件,生成具有强名称的程序集
- · 如何让一个函数返回多个值(C#)
- · C#编写的windows计算器----源代码
- · 身份证号码15位升18位(C#)
- · C#获取本地计算机名,IP,MAC地址
- · 用C#读取sina天气预报到wap页面(二)
- · 用C#读取sina天气预报到wap页面(一)
- · C#版MultiSelected DataGrid
- · 简单的多人聊天(C#.Socket).
- · C#调用ORACLE存储过程返回结果集及函数
- · C#实现的根据年月日计算星期几的函数
- · 汇总c#.net常用函数和方法集
- · 不要忽略c#中的using和as操作符
- · C#中关于GDI+输出的问题
- · 几个C# PROGRAMS
- · 几个C# PROGRAMS (2)
- · c#中的interface abstract与virtual
- · MapX从数据库读取数据形成新图层(C#)
- · C#对XML操作:建立XML(2)
- · C#对XML操作:建立XML(1)
- · C#调用父类的父类的方法
- · .NET中C#实现C/S架构下的TREEVIEW只需要输入表名,父ID,节点ID,节点名就可以得到树型结构
- · what is new in c sharp 2.0--study from msdn
- · C#设计模式之建造者(Builder)模式示例源代码
- · UBB(c#完整版)
- · c#中结构与类的区别
- · 三层结构
- · Destructors in C#
- · 链表类具有哈希表的功能
- · C#中委托,事件理解入门
