最近在项目中碰到一个很头疼的问题,在前端连接事件中写了一个广播线程,该广播线程写在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         }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-02
  • 2022-12-23
  • 2021-04-06
  • 2022-12-23
猜你喜欢
  • 2021-12-12
  • 2022-12-23
  • 2021-09-01
  • 2021-08-13
  • 2021-11-17
  • 2021-05-11
相关资源
相似解决方案