线程令牌

  最近在项目中碰到一个很头疼的问题,在前端连接事件中写了一个广播线程,该广播线程写在while循环中,但是前台会有很多个客户端,没连接一次就会有一个广播线程开启,很吃资源,刚开始我解决这个问题的方法是每次触发连接事件是检测一下当前连接数,如果是count_client<=1,就开线程,否则跳过广播,但这个方法只适用于连接事件中判断,如果我是在接收事件中,根据接收结果开启广播线程,那么就无法通过连接数来判断是否该开启广播,我思考了好久,想起算法中有个token的概念,在此可以拿来一用。

  在程序中设置一个全局线程变量tokenThread,其相当于一个令牌,拥有令牌的线程则拥有开启线程的权限,当这个收执令牌的线程在执行的过程中,如果有其他线程想要开启,都会被拒绝,知道当前执行线程结束,释放令牌,其他线程才可以开启。

  因为是自己琢磨的方法,简单的写了个demo,如果有大牛发现demo中有不足之处 ,欢迎指出,谢谢。

  demo如下:

 1  static Thread tokenThread = null;//线程令牌
 2         static int i = 0;//控制广播结束
 3         public static void Greating()
 4         {
 5
 6             Thread th = new Thread(() =>
 7             {
 8                 i = 0;
 9                 while (i++<5)//广播数据5次后结束
10                 {
11                     Console.WriteLine("我是广播线程{0},我开始广播啦!", Thread.CurrentThread.ManagedThreadId);
12                     Thread.Sleep(1000);
13                 }
14                 Console.WriteLine("我不播啦!");
15                 tokenThread = null;
16             });
17             if(tokenThread==null)   //如果令牌没人使用,则赋给该线程,否则跳过该线程
18             {
19                 tokenThread = th;
20                 th.Start();
21             }
22
23         }

  首先定义一个全程线程令牌,给其赋值为NULL,然后写了个Greeting()函数,在函数中开了个广播线程,广播5次,用时5秒,广播结束时,把令牌释放,重新赋为NULL,在启动线程时加了个if(tokenThread==null)的判断,如果令牌处于释放状态,则当前线程获得令牌,启动线程,执行广播5次,否则跳过,相当于本次Greeting()函数什么都没执行。

  main函数很简单,只是开了个while循环,在里面没1秒掉用一次Greeting()函数

1        static void Main(string[] args)
2         {
3                 while (true)
4                 {
5                     Greating();
6                     Thread.Sleep(1000);
7                 }
8
9         }

如果没有令牌控制的话,没秒都会开一个广播线程。

  最终显示结果如下,广播5次后会开新线程广播:

时间: 2024-11-04 17:47:34

线程令牌的相关文章

浏览网页错误类型大全

浏览网页错误类型大全 400 无法解析此请求. 401.1 未经授权:访问由于凭据无效被拒绝. 401.2 未经授权: 访问由于服务器配置倾向使用替代身份验证方法而被拒绝. 401.3 未经授权:访问由于 ACL 对所请求资源的设置被拒绝. 401.4 未经授权:Web 服务器上安装的筛选器授权失败. 401.5 未经授权:ISAPI/CGI 应用程序授权失败. 401.7 未经授权:由于 Web 服务器上的 URL 授权策略而拒绝访问. 403 禁止访问:访问被拒绝. 403.1 禁止访问:执

Nt内核函数原型and中文

NtLoadDriver 服务控制管理器加载设备驱动. NtUnloadDriver 服务控制管理器支持卸载指定的驱动程序. NtRegisterNewDevice 加载新驱动文件. NtQueryIntervalProfile 返回数据. NtSetIntervalProfile 指定采样间隔. NtStartProfile 开始取样. NtStopProfile 停止采样. NtSystemDebugControl 实施了一系列的调试器支持的命令. NtRegisterThreadTermi

HTTP网页异常错误代码详解

在调试TomCat,等web服务器的时候我们有时候各种错误代码铺面而来,让人头疼不已,那么这些代码究竟都代表什么呢?知道这些代码会会对我们的调试帮助很大 让我们来看一下这些代码究竟什么意思 400 无法解析此请求. 401.1 未经授权:访问由于凭据无效被拒绝. 401.2 未经授权: 访问由于服务器配置倾向使用替代身份验证方法而被拒绝. 401.3 未经授权:访问由于 ACL 对所请求资源的设置被拒绝. 401.4 未经授权:Web 服务器上安装的筛选器授权失败. 401.5 未经授权:ISA

各科基础详实

一. Java基础部分 1. JAVA的基本数据类型有哪些 ?  String 是不是基本数据类型 ? 2. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 3. Java有没有goto? 7 4. 说说&和&&的区别. 7 5. 在JAVA中如何跳出当前的多重嵌套循环? 7 6. switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 8 7. short s1 = 1; s1 = s1 + 1;有什么

PoEdu - Windows阶段班 【Po学校】Lesson006_线程_线程的启动到消亡 &amp;线程状态 &amp; 线程安全 &amp; CONTEXT结构体 &amp; 令牌锁

011_线程启动到死亡的详细讲解 1. 线程内核对象 使用计数 2 ##决定当前线程何时销毁 暂停计数 1 ##UINT类型初始为1,可以暂停多次,如置为0则取消暂停. 退出代码 STILL_ACTIVE Signaled FALSE CONTEXT 为空 2. 栈##在隶属于当前进程的空间中,分配一块"栈"空间,以供线程使用 参数 lpParam 入口地址 lpfnAddr 3. CONTEXT##线程上一次运行时的寄存器 IP(指令寄存器) void RtlUserThreadSt

《Cracking the Coding Interview》——第16章:线程与锁——题目2

2014-04-27 19:14 题目:如何测量上下文切换的时间? 解法:首先,上下文切换是什么,一搜就知道.对于这么一个极短的时间,要测量的话,可以通过放大N倍的方法.比如:有A和B两件事,并且经常一起发生,每件只需要花几纳秒.如果你把A事件连续做几百万次,而B时间只做了几次,这样就能排除B事件对于测量的影响.如果总时间S = mA + nB.当m >> n 时,A≈S / m.下面的测量方法类似于打乒乓球,在主线程和副线程间互相传递一个令牌,这个令牌可以是变量.管道之类的用于通信的工具.与

Dll注入:X86/X64 远程线程CreateRemoteThread 注入

远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLibrary()函数,进而将我们自己准备的DLL加载到远程进程空间中执行. 函数原型: HANDLE WINAPI CreateRemoteThread( _In_ HANDLE hProcess, //远程线程的句柄 _In_opt_ LPSECURITY_ATTRIBUTES lpThr

Day38:进程与线程

一 背景知识 进程的概念起源于操作系统,是操作系统最核心的概念. 进程是对正在运行程序的一个抽象,操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作系统,点击进入. 进程是操作系统提供的最古老也是最重要的抽象概念之一.即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力.将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在. 理论基础: 一 操作系统的

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg