具体的需求是 在某一时间点,只有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个线程在并发执行,其余都在队列中的实现(转载)的更多相关文章

  1. Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)

    Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...

  2. Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信

    1.Java使用Thread类代表线程.     所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...

  3. Jmeter线程组使用详解,持续加压线程组详解

    以下罗列的是Jmeter 所有线程组的详解,包括官方自带的线程组,和官方插件的线程组.官方线程组安装,详见之前的文章:https://www.cnblogs.com/beimingyouyuqingc ...

  4. Java并发1——线程创建、启动、生命周期与线程控制

    内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...

  5. 一个类有两个方法,其中一个是同步的,另一个是非同步的; 现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法?

    一个类有两个方法,其中一个是同步的,另一个是非同步的:现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法? 答案:可以 验证 package com.my.te ...

  6. iOS-多线程--介绍NSThread和GCD及其它们的线程通讯示例

    前言:下面就不一一列出 pthread.NSThread.GCD.NSOperation 的完整的各种方法了,只分别将最常用的列出来,以便偶尔瞄一眼. 一.NSThread 1> 线程间的通讯/ ...

  7. 第11章 Windows线程池(3)_私有的线程池

    11.3 私有的线程池 11.3.1 创建和销毁私有的线程池 (1)进程默认线程池 当调用CreateThreadpoolwork.CreateThreadpoolTimer.CreateThread ...

  8. C# 线程(三):如何操纵一个线程

    From : http://kb.cnblogs.com/page/42529/ 下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可.(线程入口使程序知道该让这个线程干什 ...

  9. block的是发送信号的线程,又不是处理槽函数的线程

    请问UI线程给子线程发信号,应该用哪种连接方式? 如果子线程正在执行一个函数,我发射信号去执行子线程的另一个函数,那么此时子线程到底会执行什么呢? 用信号量做的同步.第一把信号槽的事件丢到线程的事件队 ...

随机推荐

  1. 快钱支付与Sql Server的乐观锁和悲观锁

    在实际的多用户并发访问的生产环境里边,我们经常要尽可能的保持数据的一致性.而其中最典型的例子就是我们从表里边读取数据,检查验证后对数据进行修改,然后写回到数据库中.在读取和写入的过程中,如果在多用户并 ...

  2. 2015年新版C#从入门到精通(第2版)视频教学录像【无水印版】

    <c#从入门到精通(第2版)>以零基础讲解为宗旨,用实例引导读者学习,深入浅出地介绍了c#的相关知识和实战技能.<c#从入门到精通(第2版)>第1篇[c#语言基础]主要讲解c# ...

  3. 20145222黄亚奇《Java程序设计》课程总结

    20145222黄亚奇<JAVA程序设计>课程总结 每周读书笔记链接汇总 第一周读书笔记 第二周读书笔记 第三周读书笔记 第四周读书笔记 第五周读书笔记 第六周读书笔记 第七周读书笔记 第 ...

  4. 关于ARP攻击的原理以及在Kali Linux环境下的实现

    关于ARP攻击的原理以及在Kali Linux环境下的实现 全文摘要 本文讲述内容分为两部分,前半部分讲述ARP协议及ARP攻击原理,后半部分讲述在Kali Linux环境下如何实现ARP攻击以及AR ...

  5. 变量监控 指令 gt-wach

    index8.html <html><head> <title>变量监控指令 gt-watch</title> <script src=" ...

  6. grootJS ui控件定义

    index13.html <html><head> <title>ui控件定义</title> <script src="jquery- ...

  7. 一句话概括下spring框架及spring cloud框架主要组件

    作为java的屌丝,基本上跟上spring屌丝的步伐,也就跟上了主流技术.spring 顶级项目:Spring IO platform:用于系统部署,是可集成的,构建现代化应用的版本平台,具体来说当你 ...

  8. C/C++指针内存分配小细节

    char *pc = NULL; pc = new char[0]; pc[0] = '1'; 相信初学者看见上面这段代码,都会觉得奇怪,new char[n]中的n指定给指针变量分配多少内存空间,而 ...

  9. am,pm时间转换

    写在前面 最近遇到的一个问题,在英文操作系统上,获取到的时间是带am或者pm的.但是数据库是datetime类型,存储的时候竟然都变成0000-00-00 00:00:00.但是在中文操作系统上又是正 ...

  10. 每天一个linux命令(26):du 命令

    Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...