ThreadPool 线程池
最近在做通讯的项目,里面需要使用点线程池,这里做下笔记,欢迎指点!
线程池功能
应用程序可以有多个线程,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。
线程池的作用
我们在使用ADO.NET连接SQL Server时,.NET框架就会自动帮我们维护一个连接池,这就是因为重新创建一个连接的代价相对比较高昂,“复用”就显得比较划算了。不过有些朋友可能会说,我们明明是每次都创建一个SqlConnection对象,哪里有“复用”啊?这是因为.NET框架中把“连接池”做透明了,对于程序员完全隐藏了这个概念。每次我们虽然创建的是新的SqlConnection对象,但是这个对象内部占用的“数据库连接”还是会复用的。为什么总是强调用完SqlConnection对象后要及时“关闭”(Dispose或Close)呢?其实这里并没有断开数据库连接,只是把这个连接放回了连接池。等到下次创建新的SqlConnection对象时,这个连接又可以拿出来用了。
下面是一个简单的线程池例子
public static void ThreadUsePool()
{
ThreadPool.SetMinThreads(5, 5); // set min thread to 5
ThreadPool.SetMaxThreads(12, 12); // 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();
}
{
ThreadPool.SetMinThreads(5, 5); // set min thread to 5
ThreadPool.SetMaxThreads(12, 12); // 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(5, 5); // set min thread to 5
ThreadPool.SetMaxThreads(12, 12); // 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();
}
{
ThreadPool.SetMinThreads(5, 5); // set min thread to 5
ThreadPool.SetMaxThreads(12, 12); // 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个 的确是确切的说法。
出处:http://www.cnblogs.com/liuyong/
作者喜欢研究 Sql Server ,ASP.NET MVC , Jquery WCF 等技术,同时关心分布式架构的设计应用。转载请保留原文链接,谢谢!