博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#多线程--线程池(ThreadPool)
阅读量:7050 次
发布时间:2019-06-28

本文共 2802 字,大约阅读时间需要 9 分钟。

先引入一下线程池的概念:

百度百科:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在中空闲(如正在等待某个事件),则线程池将插入另一个来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

线程池主要方法:

// 参数:        // 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来解决问题,对此还不了解的朋友可以参见。

上面代码稍加改动,如下:

public class Program    {        const int cycleNum = 10;         static int cnt = 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)        {
cnt -= 1; Console.WriteLine(string.Format("{0}:第{1}个线程",DateTime.Now.ToString(),obj.ToString())); Thread.Sleep(5000); if (cnt == 0) { myEvent.Set(); } } }

这里,当线程池中所有线程执行完成后,可以捕获到该事件,我们就可以利用此方法来获取线程池终止事件了,执行结果如下:

作者:出处:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题或建议,请多多赐教,非常感谢。

转载于:https://www.cnblogs.com/yifengjianbai/p/5499493.html

你可能感兴趣的文章
LeetCode 169 Majority Element(主要元素)(vector、map)
查看>>
mysql中的几个常用的方法
查看>>
Google 的Android Splash
查看>>
2- 快速上手Linux玩转典型应用- 搭建Linux环境
查看>>
树莓派 之 微信聊天机器人(ItChat)
查看>>
如何学习一门编程语言
查看>>
Java__线程---基础知识全面实战---坦克大战系列为例
查看>>
js时间戳转换日期格式和日期计算
查看>>
真的,移动端尺寸自适应与dpr无关
查看>>
***实用函数:PHP explode()函数用法、切分字符串,作用,将字符串打散成数组
查看>>
JQuery属性与样式——.html()和.text()
查看>>
游戏中的碰撞检测
查看>>
python 回溯法 子集树模板 系列 —— 2、迷宫问题
查看>>
1455: C语言实验题――数字串求和
查看>>
halcon学习笔记——(12)图像分割
查看>>
Html 文档模式
查看>>
MongoDB 文档的删除操作
查看>>
写给刚入门的前端工程师的前后端交互指南
查看>>
又订阅了万维刚的精英日课
查看>>
代码段、数据段、堆栈段、数据段
查看>>