- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C# 线程池基础.doc
C# 线程池基础
池(Pool)是一个很常见的提高性能的方式。比如线程池连接池等,之所以有这些池是因 为线程和数据库连接的创建和关闭是一种比较昂贵的行为。对于这种昂贵的资源我们往往会考虑在一个池容器中放置一些资源,在用的时候去拿,在不够的时候添 点,在用完就归还,这样就可以避免不断的创建资源和销毁资源。
如果您做过相关实验的话可能会觉得不以为然,似乎开1000个线程也用不了几百毫秒。我们要这么想,对于一个高并发的环境来说,每一秒假设有100 个请求,每个请求需要使用(开和关)10个线程,也就是一秒需要处理1000个线程的开和关,每个线程独立堆栈1M,可以想象在这一秒中内存分配和回收是 多么夸张,这个开销不能说不昂贵。
首先,要理解线程池线程分为两类工作线程和IO线程,可以单独设置最小线程数和最大线程数:
ThreadPool.SetMinThreads(2, 2);ThreadPool.SetMaxThreads(4, 4);
最大线程数很好理解,就是线程池最多创建这些线程,如果最大4个线程,现在这4个线程都在运行的话,后续进来的线程只能排队等待了。那么为什么有最 小线程一说法呢?其实之所以使用线程池是不希望线程在创建后运行结束后理解回收,这样的话以后要用的时候还需要创建,我们可以让线程池至少保留几个线程, 即使没有线程在工作也保留。上述语句我们设置线程池一开始就保持2个工作线程和2个IO线程,最大不超过4个线程。
至于线程池的使用相当简单先来看一段代码:
for (int i = 0; i totalThreads; i++){??? ThreadPool.QueueUserWorkItem(o =??? {??????? Thread.Sleep(1000);??????? int a, b;??????? ThreadPool.GetAvailableThreads(out a, out b);??????? Console.WriteLine(string.Format(({0}/{1}) #{2} : {3}, a, b, Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString(mm:ss)));??? });}Console.WriteLine(Main thread finished);Console.ReadLine();
代码里面用到了一个事先定义的静态字段:
static readonly int totalThreads = 10;
代码运行结果如下:?
每一个线程都休眠一秒然后输出当前线程池可用的工作线程和IO线程以及当前线程的托管ID和时间。我们通过这段代码可以发现线程池的几个特性:
1) 线程池中的线程都是后台线程,如果没有在主线程使用ReadLine的话,程序马上会退出。
2) 线程池一开始就占用了2个线程,一秒后占用了4个线程,工作线程将会由3-6四个线程来处理。
3) 线程池最多使用了4个工作线程和0个IO线程。
那么,我们如何知道线程池中的线程都运行结束了呢,可以想到上文用过的Monitor结构:
Stopwatch sw = Stopwatch.StartNew();for (int i = 0; i totalThreads; i++){??? ThreadPool.QueueUserWorkItem(o =??? {??????? Thread.Sleep(1000);??????? int a, b;??????? ThreadPool.GetAvailableThreads(out a, out b);??????? Console.WriteLine(string.Format(({0}/{1}) #{2} : {3}, a, b, Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString(mm:ss)));??????? lock (locker)??????? {??????????? runningThreads--;??????????? Monitor.Pulse(locker);??????? }
??? });}
lock (locker){??? while (runningThreads 0)??????? Monitor.Wait(locker);}
Console.WriteLine(sw.ElapsedMilliseconds);Console.ReadLine();
程序中用到了两个辅助字段:
static object locker = new obje
您可能关注的文档
- 9..眼和耳.ppt
- 9GB-2.1半悬挂往复式割草机和背负割灌机价格.docx
- 9、1遭遇险情有对策.ppt
- 9、两小儿辩日.ppt
- 9马力柴油微耕机和小型农用微耕机价格.docx
- A-19表, 监表.doc
- About 天闻点读笔.ppt
- AI CS5快捷键 PC&MAC.doc
- China Will Be on Bullet Train 上海自贸--中国再次飞腾.ppt
- C语言链表的建立、插入和删除.docx
- 精编贵州省贵阳市企业人力资源管理师之一级人力资源管理师考试精品(名师系列).docx
- 精编贵州省毕节地区企业人力资源管理师之四级人力资源管理师考试真题及答案【新】.docx
- 荷塘月色读书心得6篇_荷塘月色读后感 .pdf
- 网格化管理实施方案范文锦集9篇.pdf
- 精编贵州省黔西南布依族苗族自治州企业人力资源管理师之一级人力资源管理师考试题库附答案【实用】.docx
- 观看《我和我的父辈》个人心得体会2023 .pdf
- 精编贵州省黔南布依族苗族自治州企业人力资源管理师之四级人力资源管理师考试内部题库【真题汇编】.docx
- 精编贵州省黔东南苗族侗族自治州企业人力资源管理师之四级人力资源管理师考试通关秘籍题库附答案(能力提升.docx
- 职业健康安全生产工作讲话.pdf
- 精编贵州省遵义市企业人力资源管理师之四级人力资源管理师考试及参考答案(B卷).docx
文档评论(0)