自强不息,止于至善

身无半文,心忧天下;手释万卷,神交古人
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

线程池

Posted on 2007-10-27 12:25  L.Zhang  阅读(350)  评论(1)    收藏  举报

   “线程池”是可以用来在后台执行多个任务的线程集合,这使主线程可以自由地异步执行其他任务。线程池通常用于服务器应用程序。每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会占用主线程,也不会延迟后续请求的处理。一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。这种重用使应用程序可以避免为每个任务创建新线程的开销。线程池通常具有最大线程数限制。如果所有线程都繁忙,则额外的任务将放入队列中,直到有线程可用时才能够得到处理。
    你可以通过System.Threading 名称空间的Thread Pool 类来使用线程池,如果你查看一下这个类,就会发现所有的成员都是静态的,而且没有公开的构造函数。这是有理由这样做的,因为每个进程只有一个线程池,并且我们不能创建新的。这个限制的目的是为了把所有的异步编程技术都集中到同一个池中。所以我们不能拥有一个通过第三方组建创建的无法管理的线程池。
 
ThreadPool.QueueUserWorkItem的声明如下: public static bool QueueUserWorkItem (WaitCallback callBack, object state)
第一个参数指明我们将在池中执行的函数,它的声明必须与WaitCallback委托(delegate)互相匹配:public delegate void WaitCallback (object state);
State 参数允许任何类型的信息传递到该方法中,它在调用QueueUserWorkItem时传入。

using System;
using System.Threading;
namespace ThreadPoolTest
{
    
class MainApp
    
{
        
static void Main()
        
{
            WaitCallback callBack;

            callBack 
= new WaitCallback(PooledFunc);
            ThreadPool.QueueUserWorkItem(callBack, 
"Is there any screw left?");
            ThreadPool.QueueUserWorkItem(callBack, 
"How much is a 40W bulb?");
            ThreadPool.QueueUserWorkItem(callBack, 
"Decrease stock of monkey wrench");
            Console.ReadLine();
        }


        
static void PooledFunc(object state)
        
{
            Console.WriteLine(
"Processing request ’{0}’", (string)state);
            Thread.Sleep(
2000);
            Console.WriteLine(
"Request processed");
        }

    }

}