ThreadPool 线程池

  最近在做通讯的项目,里面需要使用点线程池,这里做下笔记,欢迎指点!

线程池功能
  应用程序可以有多个线程,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。


线程池的作用
我们在使用ADO.NET连接SQL Server时,.NET框架就会自动帮我们维护一个连接池,这就是因为重新创建一个连接的代价相对比较高昂,“复用”就显得比较划算了。不过有些朋友可能会说,我们明明是每次都创建一个SqlConnection对象,哪里有“复用”啊?这是因为.NET框架中把“连接池”做透明了,对于程序员完全隐藏了这个概念。每次我们虽然创建的是新的SqlConnection对象,但是这个对象内部占用的“数据库连接”还是会复用的。为什么总是强调用完SqlConnection对象后要及时“关闭”(Dispose或Close)呢?其实这里并没有断开数据库连接,只是把这个连接放回了连接池。等到下次创建新的SqlConnection对象时,这个连接又可以拿出来用了。

 

下面是一个简单的线程池例子

 public static void ThreadUsePool()
          {
               ThreadPool.SetMinThreads(
55);  // set min thread to 5
               ThreadPool.SetMaxThreads(1212); // set max thread to 12

               
for (int i = 0; i < 20; i++)
               {
                    ThreadPool.QueueUserWorkItem(CallBack, i);
               }

               Console.ReadLine();
          }

          
public static void CallBack(object index)
          {
               DateTime now 
= DateTime.Now;
               Console.WriteLine(String.Format(
"{0}: {1} ", now, index));
               Thread.Sleep(
20000);
               Console.WriteLine(String.Format(
"{0}: {1}", now, index));
               Console.ReadLine();



          }
          public static void ThreadUsePool()
          {
               ThreadPool.SetMinThreads(
55);  // set min thread to 5
               ThreadPool.SetMaxThreads(1212); // set max thread to 12

               
for (int i = 0; i < 20; i++)
               {
                    ThreadPool.QueueUserWorkItem(CallBack, i);
               }

               Console.ReadLine();
          }

          
public static void CallBack(object index)
          {
               DateTime now 
= DateTime.Now;
               Console.WriteLine(String.Format(
"{0}: {1} ", now, index));
               Thread.Sleep(
20000);
               Console.WriteLine(String.Format(
"{0}: {1}", now, index));
               Console.ReadLine();



          }

 总结:

   最小线程数量为5时,只有4个线程可以立即执行。经过进一步尝试,最小线程数量为10时,也只有9个线程可以立即执行。 
   线程池创建线程的速度并非永远是“每秒2个”,  每秒不超过2个 的确是确切的说法。

 

posted @ 2010-11-30 16:29  jackyong  阅读(753)  评论(0编辑  收藏  举报