C#多线程--线程池(ThreadPool)
2018-06-18 04:35:18来源:未知 阅读 ()
先引入一下线程池的概念:
百度百科:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
线程池主要方法:
// 参数: // workerThreads: // 要由线程池根据需要创建的新的最小工作程序线程数。 // completionPortThreads: // 要由线程池根据需要创建的新的最小空闲异步 I/O 线程数。// 返回结果:如果更改成功,则为 true;否则为 false。 [SecuritySafeCritical] public static bool SetMinThreads(int workerThreads, int completionPortThreads); // 参数: // workerThreads: // 线程池中辅助线程的最大数目。 // completionPortThreads: // 线程池中异步 I/O 线程的最大数目。 // 返回结果:如果更改成功,则为 true;否则为 false。 [SecuritySafeCritical] public static bool SetMaxThreads(int workerThreads, int completionPortThreads);
先来看一个简单的例子:
public class Program { const int cycleNum = 10; static void Main(string[] args) { ThreadPool.SetMinThreads(1,1); ThreadPool.SetMaxThreads(5, 5); for(int i = 1; i <= cycleNum; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(testFun),i.ToString()); } Console.WriteLine("主线程执行!"); Console.WriteLine("主线程结束!"); Console.ReadKey(); } public static void testFun(object obj) { Console.WriteLine(string.Format("{0}:第{1}个线程",DateTime.Now.ToString(),obj.ToString())); Thread.Sleep(5000); } }附上结果:
这里可以看出,线程池里线程的执行不影响主线程的运行,线程池虽然可以管理多线程的执行,但是却无法知道它什么时候终止。这时候我们可以利用之前讲的信号灯AutoResetEvent和ManualResetEvent来解决问题,对此还不了解的朋友可以参见多线程之AutoResetEvent。
上面代码稍加改动,如下:
public class Program { const int cycleNum = 10; static AutoResetEvent myEvent = new AutoResetEvent(false); static void Main(string[] args) { ThreadPool.SetMinThreads(1,1); ThreadPool.SetMaxThreads(5, 5); for(int i = 1; i <= cycleNum; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(testFun),i.ToString()); } Console.WriteLine("主线程执行!"); Console.WriteLine("主线程结束!"); myEvent.WaitOne(); Console.WriteLine("线程池终止!"); Console.ReadKey(); } public static void testFun(object obj) { Console.WriteLine(string.Format("{0}:第{1}个线程",DateTime.Now.ToString(),obj.ToString())); Thread.Sleep(5000); if (obj.ToString() == cycleNum.ToString()) { myEvent.Set(); } } }这里,当线程池中所有线程执行完成后,可以捕获到该事件,我们就可以利用此方法来获取线程池终止事件了,执行结果如下:
作者:依封剑白 出处:C#多线程--线程池(ThreadPool) 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题或建议,请多多赐教,非常感谢。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 最详细的java多线程教程来了 2020-06-08
- 系统化学习多线程(一) 2020-06-08
- 多线程:生产者消费者(管程法、信号灯法) 2020-06-01
- 如何合理地估算线程池大小? 2020-05-31
- 那些面试官必问的JAVA多线程和并发面试题及回答 2020-05-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash