欢迎来到天天文库
浏览记录
ID:46256166
大小:76.28 KB
页数:15页
时间:2019-11-22
《聊一聊C#线程池基础》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C#线程池基础池(Pool)是一个很常见的提高性能的方式。比如线程池连接池等,之所以有这些池是因为线程和数据库连接的创建和关闭是一种比较昂贵的行为。对于这种昂贵的资源我们往往会考虑在一个池容器中放置一些资源,在用的吋候去拿,在不够的时候添点,在用完就归还,这样就可以避免不断的创建资源和销毁资源。如果您做过相关实验的话可能会觉得不以为然,似乎开1000个线程也用不了儿百毫秒。我们要这么想,对于一个高并发的环境來说,每一秒假设有100个请求,每个请求需要使用(开和关)10个线程,也就是一秒需耍处理1000个线程的开和关,每个线程独立堆栈1M,可以
2、想象在这一秒中内存分配和冋收是多么夸张,这个开销不能说不昂贵。首先,要理解线程池线程分为两类工作线程和10线程,可以单独设置最小线程数和最大线程数:ThreadPool.SetMinThreads(2,2);ThreadPool.SetMaxThreads(4,4);最大线程数很好理解,就是线程池最多创建这些线程,如果最大4个线程,现在这4个线程都在运行的话,后续进来的线程只能排队等待了。那么为什么有最小线程一说法呢?其实Z所以使用线程池是不希望线程在创建后运行结朿后理解回收,这样的话以后要用的吋候还需要创建,我们可以让线程池至少保留几个线程
3、,即使没有线程在工作也保留。上述语句我们设置线程池一开始就保持2个工作线程和2个10线程,最大不超过4个线程。至于线程池的使用相当简单先来看一段代码:for(inti=0;i4、rcntThrcad・MeinagedThrcadld,DateTime.Now.ToString("mm:ss〃)));});Console・WriteLine("Mainthreadfinished");Console.ReadLine();代码里面用到了一个事先定义的静态字段:staticreadonlyinttotalThreads二10;代码运行结果如下:cTCWINDOVVSsystem32cm24:16<2Z4>24:169324:17<0Z4>24:17<0z4>25、4:17<0/4>24:17<0z4>24:18(1/4)ns24:18<0/4>24:18<3/4>4624:18每一个线程都休眠一秒然后输出当前线程池口J用的工作线程和T0线程以及当前线程的托管ID和时间。我们通过这段代码可以发现线程池的几个特性:1)线程池屮的线程都是后台线程,如果没冇在主线程使用ReadLine的话,程序马上会退出。2)线程池一开始就占用了2个线程,一秒后占用了4个线程,工作线程将会市3-6四个线程來处理。3)线程池最多使用了4个工作线程和0个10线程。那么,我们如何知道线程池屮的线程都运行结束了呢,可以想到上文用过的6、Monitor结构:Stopwatchsw=Stopwatch.StartNewO;for(inti=0;i{Thread.Sleep(lOOO);inta,b;ThreadPool.GctAvailableThrcads(outa,outb);Console.WriteLine(string.Format(,z({0}/{1})#{2}:{3}〃,a,b,Thread.CurrentThread.ManagedThreadld,DateT7、ime.Now.ToString(z,mm:ss")));lock(locker)runningThreads--;Monitor.Pulse(locker);});}lock(locker){whi1e(runningThreads>0)Monitor.Wait(locker);}Console.WriteLine(sw.ElapsedMilliseconds);Console.ReadLine();程序中用到了两个辅助字段:staticobjectlocker=newobject();staticintrunningThrcads二tot8、alThrcads;程序运行结果如下:9、c:GWIN[X)WSsystem32cfnd-exe10、<2/4〉tt429:50<2/4〉#329:50<0/4>
4、rcntThrcad・MeinagedThrcadld,DateTime.Now.ToString("mm:ss〃)));});Console・WriteLine("Mainthreadfinished");Console.ReadLine();代码里面用到了一个事先定义的静态字段:staticreadonlyinttotalThreads二10;代码运行结果如下:cTCWINDOVVSsystem32cm24:16<2Z4>24:169324:17<0Z4>24:17<0z4>2
5、4:17<0/4>24:17<0z4>24:18(1/4)ns24:18<0/4>24:18<3/4>4624:18每一个线程都休眠一秒然后输出当前线程池口J用的工作线程和T0线程以及当前线程的托管ID和时间。我们通过这段代码可以发现线程池的几个特性:1)线程池屮的线程都是后台线程,如果没冇在主线程使用ReadLine的话,程序马上会退出。2)线程池一开始就占用了2个线程,一秒后占用了4个线程,工作线程将会市3-6四个线程來处理。3)线程池最多使用了4个工作线程和0个10线程。那么,我们如何知道线程池屮的线程都运行结束了呢,可以想到上文用过的
6、Monitor结构:Stopwatchsw=Stopwatch.StartNewO;for(inti=0;i{Thread.Sleep(lOOO);inta,b;ThreadPool.GctAvailableThrcads(outa,outb);Console.WriteLine(string.Format(,z({0}/{1})#{2}:{3}〃,a,b,Thread.CurrentThread.ManagedThreadld,DateT
7、ime.Now.ToString(z,mm:ss")));lock(locker)runningThreads--;Monitor.Pulse(locker);});}lock(locker){whi1e(runningThreads>0)Monitor.Wait(locker);}Console.WriteLine(sw.ElapsedMilliseconds);Console.ReadLine();程序中用到了两个辅助字段:staticobjectlocker=newobject();staticintrunningThrcads二tot
8、alThrcads;程序运行结果如下:
9、c:GWIN[X)WSsystem32cfnd-exe
10、<2/4〉tt429:50<2/4〉#329:50<0/4>
此文档下载收益归作者所有