Document

C# 多线程 线程池(ThreadPool) 2 如何控制线程池?

线程池启动了,但是没有方法去控制线程池,如果子线程出现了问题,难道线程池就死了吗?

我们可以设置线程池的线程数量,进行加入任务,线程池会自动分配并且合理的执行,但是控制不了又有啥意思呢。

线程池里线程的执行不影响主线程的运行的。

线程池中有一个东西叫做 信号灯 下面是一个例子:

 

  1. public class Program
  2. {
  3.     const int cycleNum = 10;
  4.     static AutoResetEvent myEvent = new AutoResetEvent(false);
  5.     static void Main(string[] args)
  6.     {
  7.         ThreadPool.SetMinThreads(1, 1);
  8.         ThreadPool.SetMaxThreads(2, 2);
  9.         for (int i = 1; i <= cycleNum; i++)
  10.         {
  11.             ThreadPool.QueueUserWorkItem(new WaitCallback(testFun), i.ToString());
  12.         }
  13.         Console.WriteLine("主线程执行!");
  14.         Console.WriteLine("主线程结束!");
  15.         Console.WriteLine("阻塞");
  16.         myEvent.WaitOne();
  17.         Console.WriteLine("线程池终止!");
  18.         Console.ReadKey();
  19.     }
  20.     public static void testFun(object obj)
  21.     {
  22.         Console.WriteLine(string.Format("{0}:第{1}个线程", DateTime.Now.ToString(), obj.ToString()));
  23.         Thread.Sleep(5000);
  24.         if (obj.ToString() == cycleNum.ToString())
  25.         {
  26.             Console.WriteLine("终止了");
  27.             myEvent.Set();
  28.         }
  29.     }
  30. }
复制代码





代码的信号灯的作用,当任务全部投放在线程池中,我们开启了阻塞线程池。

之后,我们又在执行的函数中,添加了代码,也就是


  1. if (obj.ToString() == cycleNum.ToString())
  2.         {
  3.             Console.WriteLine("终止了");
  4.             myEvent.Set();
  5.         } 


很明显,我们判断了当前执行的数量以及我们项目的总数量。如果达到总数量,则代表线程池已经执行完毕,我们可以监控他是否完毕,

当代码:myEvent.WaitOne(); 执行了,它不仅阻塞,他会等待。等到我们的myEvent.Set(); 信号发出之后,即可恢复继续执行。

posted @ 2017-11-16 09:35  从未被超越  阅读(750)  评论(0编辑  收藏  举报