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的负载平衡上面~

这样我就可以自己控制请求的数量了~

时间: 2024-11-03 21:54:31

C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现的相关文章

关于线程的参数、“返回值”、及线程的中止

关于线程的参数(2.0)."返回值".及线程的中止 1.线程的参数:有时候会想向辅助线程传递些信息,这里需要用到ParameterizedThreadStart 委托 示例:         private void btRunThread_Click(object sender, EventArgs e)        {            Thread t = new Thread(new ParameterizedThreadStart(this.ThreadRun));  

线程超时控制问题,怎么实现非阻塞线程超时

问题描述 线程超时控制问题,怎么实现非阻塞线程超时 使用该线程池方式实现超时管理,必须等待线程运行完毕 时阻塞式的 非阻塞式的怎么实现? 解决方案 http://ifeve.com/boundlesscyclicbarrier/ 参考这个

安卓,子线程获取网络图片,发消息给主线程,主线程用图片填充listview,出错

问题描述 安卓,子线程获取网络图片,发消息给主线程,主线程用图片填充listview,出错 先上logcat: 我的xml布局就是一个按钮,和一个listview,listview里就一个imageview,按下按钮开始从网络获取图片,然后发消息到主线程,然后listview就填充数据.xml代码就不贴了. 以下是mainactivity public class MainActivity extends AppCompatActivity implements View.OnClickList

java线程问题:为什么打印的结果每次不同?为什么执行的顺序不同?

问题描述 java线程问题:为什么打印的结果每次不同?为什么执行的顺序不同? 求大神指教为什么每次打印的结果会不同? 原码贴上: package com.Sixping.Ncre08; public class TreadTest { public static void main(String[] args) { Thread t1 = new Thread(new Hello()); Thread t2 = new Thread(new Hello()); Thread t3 = new T

c# 子线程调用timer控件 我打了断点发现没执行;要怎么才能让他执行呢

问题描述 c# 子线程调用timer控件 我打了断点发现没执行:要怎么才能让他执行呢 c# 子线程调用timer控件 我打了断点发现没执行:要怎么才能让他执行呢 解决方案 不要直接调用UI组件,Thread自己有Timer,定时执行后,通过委托去控制UI

多线程间,变量可见性问题。一个线程会永远看不到另一个线程的更新吗?

问题描述 多线程间,变量可见性问题.一个线程会永远看不到另一个线程的更新吗? 作者说,由于读线程可能永远发现不了main对ready变量的修改就会永远循环下去,但是貌似不太可能永远读不到main对ready变量修改之后的值吧,可能会由于从栈区复制回堆区时,有几毫秒的误差,read线程读到的是旧值,但堆区值更新之后,read线程就读到了新值了吧,为什么说会永远循环下去呢? 解决方案 再回去又读了一遍,有如下解释: 根据JVM设置,如果设置成server模式会有指令重排,如上述循环判断就会变成if(

怎么把主线程getText()得到的String放进子线程

问题描述 怎么把主线程getText()得到的String放进子线程 解决方案 不一定非要定义全局变量,我修改的如下,你运行看看,不行再定义全局变量.修改了3个地方 public class StartLoginActivity extends Activity { // 账号输入框 private EditText inputAccount; //密码输入框 private EditText inputPassword; // 登录按钮 private Button loginButton;

创建一个线程A,线程A还可以继续创建另外的线程b吗?

问题描述 各位大虾们 现在我已经创建了以个线程A. 我还想用这个线程A创建另外的一个线程b. 可以这样理解:线程b是由线程A创建的. 这样的话,线程b可以创建吗? 有没有代码可以参考的?[color=darkred][/color] 解决方案 首先,线程可以继续创建线程.给你看个例子:public class SimpleThreads {// Display a message, preceded by the name of the current threadpublic static v

C# 10个线程并发执行Halcon图像算法 报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

问题描述 如题,这个问题我已经纠结了快三个工作日了.我不同WinFrom程序一起动就会开启10个线程,并发对10张图片进行算法处理,问题是只要程序一起动就会报"尝试读取或写入受保护的内存.这通常指示其他内存已损坏."异常.我试过将8个线程停掉,只开两个,发现没有问题,开三个四个偶尔会出问题....反正10个一个开是一定会报异常的.开起来好像是线程开太多CPU反应不过来导致的问题,可是CPU反应不过来就会报"尝试读取或写入受保护的内存.这通常指示其他内存已损坏."异常