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的负载平衡上面~
这样我就可以自己控制请求的数量了~
转载于:https://www.cnblogs.com/sandea/p/3293709.html
C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现(转载)...相关推荐
- C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现
上司交代要做一个小测试 具体的需求是 在某一时间点,只有N个线程在并发执行,如果有多余的线程,则排队等候~ 还真是费尽心思啊~最终还是被我攻克了~ 下面我就来说说具体的实现 C#提供了Mutex与In ...
- Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步
主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...
- thread.sleep是让哪个线程休眠_java多线程必看:java线程的生命周期
点击蓝字 关注我们 线程是一个动态执行的过程,它也有从创建到死亡的过程.线程的几种状态 在 Thread 类中,有一个枚举内部类: 上面的信息以图片表示如下: 第一张图: 第二张图:把等待.计时等待. ...
- 线程控制、如何给面试官描述线程不安全的情况?模拟黄牛抢票展现不安全的情况及解决方式、互斥锁加锁解锁
多线程1 线程概念 线程控制 线程创建 线程终止 线程等待 线程分离 线程安全 如何给面试官描述线程不安全的现象? 线程不安全的情况(模拟黄牛抢票) 互斥 互斥锁的原理 互斥锁的接口 静态初始化 动态 ...
- mfc怎么获取进程的线程数_2020年大厂喜欢这样问线程安全,这些知识点我整理好了
2020年,截止目前,我收到了阿里巴巴.腾讯.美团.京东.快手等互联网大厂的面试邀请.求职是一场流程很长的拉锯战,涉及岗位选择.简历投递.简历评估.技术面试.HR面试等环节. 我发现在技术面试中多线程 ...
- 【4万字Linux线程解析】从0开始学习Linux线程
文章目录 一.线程基本概念 1. 并发和并行 2. 线程的引入 3. 什么是线程 4. Linux下的线程 5. 线程的优点和缺点 (1)计算密集型应用 (2)IO密集型应用 (3)计算密集型程序创建 ...
- 线程和并发(三)阻塞队列和线程池
concurrent之atomic相关 概述 java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实 ...
- Java一个线程能否结束另一个永不停止的线程
在Java中停止一个线程有三种办法 : 1.正常结束执行: 2.发生异常; 3.被其他线程stop(Java官方不建议) 参考:https://docs.oracle.com/javase/8/doc ...
- 问一下,线程池里面到底该设置多少个线程?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:只会一点java cnblogs.com/dennyzhan ...
最新文章
- AI专利之争:小米超华为,国家电网才是大Boss?
- linux c/c++
- django登录连接html,Django——登录功能(连接mysql)
- 利用SOS扩展库进入高阶.NET6程序的调试
- 33迭代器模式(Iterator Pattern)
- Python爬虫Scrapy框架IP代理的配置与调试
- mysql查找配置文件的顺序
- 16bit随机数生成matlab,关于matlab生成随机数
- 客户端VS2010 Team Foundation Server中删除项目
- 写了一个验证数字范围的正则表达式
- python整行列匹配,python-熊猫将行与列值匹配
- argis利用gp工具打包tpk切片包
- 网站建设流程是什么?
- html中图片放大镜效果图,HTML5使用不同精度的图片来实现图像放大镜效果
- Windows注册表内容详解(转载)
- SAP UI5 应用开发教程之八十三 - SAP UI5 的自动化测试套件页面的开发步骤介绍试读版
- iqn怎么查 linux_如何利用procfs读取iSCSI Initiator IQN信息
- php格式化数字:位数不足前面加0补足
- 漫画|微信群聊的程序员们
- python合法标识符_Python isidentifier()判断是否为Python的合法标识符
热门文章
- 驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)...
- (35)23种设计模式研究之六【命令模式】
- atcoder 076
- web 网页截取图片
- ASP.NET Core 1.0开发Web API程序
- 简单说下COALESCE这个日常使用的函数
- OC中的字符串常用方法
- jQuery 双击事件(dblclick)时,不触发单击事件(click)
- avcodec_decode_video2()解码视频后丢帧的问题解决
- Ubuntu Server 13.04安装图形界面