具体的需求是 在某一时间点,只有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的负载平衡上面~

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

转载于:https://www.cnblogs.com/sandea/p/3293709.html

C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现(转载)...相关推荐

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

    上司交代要做一个小测试 具体的需求是 在某一时间点,只有N个线程在并发执行,如果有多余的线程,则排队等候~ 还真是费尽心思啊~最终还是被我攻克了~ 下面我就来说说具体的实现 C#提供了Mutex与In ...

  2. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  3. thread.sleep是让哪个线程休眠_java多线程必看:java线程的生命周期

    点击蓝字 关注我们 线程是一个动态执行的过程,它也有从创建到死亡的过程.线程的几种状态 在 Thread 类中,有一个枚举内部类: 上面的信息以图片表示如下: 第一张图: 第二张图:把等待.计时等待. ...

  4. 线程控制、如何给面试官描述线程不安全的情况?模拟黄牛抢票展现不安全的情况及解决方式、互斥锁加锁解锁

    多线程1 线程概念 线程控制 线程创建 线程终止 线程等待 线程分离 线程安全 如何给面试官描述线程不安全的现象? 线程不安全的情况(模拟黄牛抢票) 互斥 互斥锁的原理 互斥锁的接口 静态初始化 动态 ...

  5. mfc怎么获取进程的线程数_2020年大厂喜欢这样问线程安全,这些知识点我整理好了

    2020年,截止目前,我收到了阿里巴巴.腾讯.美团.京东.快手等互联网大厂的面试邀请.求职是一场流程很长的拉锯战,涉及岗位选择.简历投递.简历评估.技术面试.HR面试等环节. 我发现在技术面试中多线程 ...

  6. 【4万字Linux线程解析】从0开始学习Linux线程

    文章目录 一.线程基本概念 1. 并发和并行 2. 线程的引入 3. 什么是线程 4. Linux下的线程 5. 线程的优点和缺点 (1)计算密集型应用 (2)IO密集型应用 (3)计算密集型程序创建 ...

  7. 线程和并发(三)阻塞队列和线程池

    concurrent之atomic相关 概述 java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实 ...

  8. Java一个线程能否结束另一个永不停止的线程

    在Java中停止一个线程有三种办法 : 1.正常结束执行: 2.发生异常; 3.被其他线程stop(Java官方不建议) 参考:https://docs.oracle.com/javase/8/doc ...

  9. 问一下,线程池里面到底该设置多少个线程?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:只会一点java cnblogs.com/dennyzhan ...

最新文章

  1. AI专利之争:小米超华为,国家电网才是大Boss?
  2. linux c/c++
  3. django登录连接html,Django——登录功能(连接mysql)
  4. 利用SOS扩展库进入高阶.NET6程序的调试
  5. 33迭代器模式(Iterator Pattern)
  6. Python爬虫Scrapy框架IP代理的配置与调试
  7. mysql查找配置文件的顺序
  8. 16bit随机数生成matlab,关于matlab生成随机数
  9. 客户端VS2010 Team Foundation Server中删除项目
  10. 写了一个验证数字范围的正则表达式
  11. python整行列匹配,python-熊猫将行与列值匹配
  12. argis利用gp工具打包tpk切片包
  13. 网站建设流程是什么?
  14. html中图片放大镜效果图,HTML5使用不同精度的图片来实现图像放大镜效果
  15. Windows注册表内容详解(转载)
  16. SAP UI5 应用开发教程之八十三 - SAP UI5 的自动化测试套件页面的开发步骤介绍试读版
  17. iqn怎么查 linux_如何利用procfs读取iSCSI Initiator IQN信息
  18. php格式化数字:位数不足前面加0补足
  19. 漫画|微信群聊的程序员们
  20. python合法标识符_Python isidentifier()判断是否为Python的合法标识符

热门文章

  1. 驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)...
  2. (35)23种设计模式研究之六【命令模式】
  3. atcoder 076
  4. web 网页截取图片
  5. ASP.NET Core 1.0开发Web API程序
  6. 简单说下COALESCE这个日常使用的函数
  7. OC中的字符串常用方法
  8. jQuery 双击事件(dblclick)时,不触发单击事件(click)
  9. avcodec_decode_video2()解码视频后丢帧的问题解决
  10. Ubuntu Server 13.04安装图形界面