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的负载平衡上面~
这样我就可以自己控制请求的数量了~
C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现(转载)的更多相关文章
- Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)
Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...
- Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信
1.Java使用Thread类代表线程. 所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...
- Jmeter线程组使用详解,持续加压线程组详解
以下罗列的是Jmeter 所有线程组的详解,包括官方自带的线程组,和官方插件的线程组.官方线程组安装,详见之前的文章:https://www.cnblogs.com/beimingyouyuqingc ...
- Java并发1——线程创建、启动、生命周期与线程控制
内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...
- 一个类有两个方法,其中一个是同步的,另一个是非同步的; 现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法?
一个类有两个方法,其中一个是同步的,另一个是非同步的:现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法? 答案:可以 验证 package com.my.te ...
- iOS-多线程--介绍NSThread和GCD及其它们的线程通讯示例
前言:下面就不一一列出 pthread.NSThread.GCD.NSOperation 的完整的各种方法了,只分别将最常用的列出来,以便偶尔瞄一眼. 一.NSThread 1> 线程间的通讯/ ...
- 第11章 Windows线程池(3)_私有的线程池
11.3 私有的线程池 11.3.1 创建和销毁私有的线程池 (1)进程默认线程池 当调用CreateThreadpoolwork.CreateThreadpoolTimer.CreateThread ...
- C# 线程(三):如何操纵一个线程
From : http://kb.cnblogs.com/page/42529/ 下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可.(线程入口使程序知道该让这个线程干什 ...
- block的是发送信号的线程,又不是处理槽函数的线程
请问UI线程给子线程发信号,应该用哪种连接方式? 如果子线程正在执行一个函数,我发射信号去执行子线程的另一个函数,那么此时子线程到底会执行什么呢? 用信号量做的同步.第一把信号槽的事件丢到线程的事件队 ...
随机推荐
- php基础07:流程控制
<?php //1.PHP foreach循环只适用于数组,并用于遍历数组中的每个键/值对. $colors = array("red","green", ...
- JS调用Silverlight方法拾遗
在最近做的物联网项目中,需要利用封装过的Silverlight刻度控件显示温度,湿度,二氧化碳浓度等值.由于最新的数据是通过js ajax获取的,所以需要把这些数据传递给silverlight显示,这 ...
- 前端开发工程师:网易web前端课程,价值1499元【无水印版】
这套网上的朋友购买分享给我的,特此分享~ 让大家都受益 早日成为强大的web前端开发工程师!!赶紧回复下载吧 下载地址:http://fu83.cn/thread-172-1-1.html
- [MetaHook] Quake OpenGL function
Quake OpenGL function for MetaHook plugin. Thank hzqst :D QGL.h #ifndef QGL_H #define QGL_H #include ...
- linux内核分析 期中总结
LINUX内核分析 链接汇总 LINUX内核分析第一周学习总结——计算机是如何工作的 LINUX内核分析第二周学习总结——操作系统是如何工作的 LINUX内核分析第三周学习总结——构造一个简单的Lin ...
- 动态下载苹果系统提供的多种中文字体(适合对字体有较多需求的应用比如阅读类的app)
链接:https://developer.apple.com/library/ios/samplecode/DownloadFont/Listings/DownloadFont_ViewControl ...
- iOS程序中调用系统自带应用(短信,邮件,浏览器,地图,appstore,拨打电话,iTunes,iBooks )
在网上找到了下在记录下来以后方便用 在程序中调用系统自带的应用,比如我进入程序的时候,希望直接调用safar来打开一个网页,下面是一个简单的使用:
- 总体最小二乘(TLS)
对于见得多了的东西,我往往就习以为常了,慢慢的就默认了它的存在,而不去思考内在的一些道理.总体最小二乘是一种推广最小二乘方法,本文的主要内容参考张贤达的<矩阵分析与应用>. 1. 最小二乘 ...
- 在Ubuntu-14.04.3配置并成功编译Android6_r1源码
折腾了一周,终于把Android6_r1的源码编译成功.先上图,这是在ubuntu中运行的Android模拟器: 由于我是在win8中安装虚拟机VMware,然后在虚拟机中安装Ubuntu进行编译,所 ...
- 怎样将SQL Azure数据库备份到本地或者Storage
怎样备份SQL Azure数据库到本地或者云存储Storage,可以使用SQL Database Import Export 的功能. 具体操作如下: 用SSMS链接SQL Azure数据库 注意:服 ...