ThreadPool 的线程开启、线程等待、线程池的设置、定时功能
![ThreadPool的线程开启、线程等待、线程池的设置、定时功能](https://static001.geekbang.org/infoq/f4/f4a3d0c3e68daddbb95592a64a9001f2.png)
一. ThreadPool 简介
ThreadPool 简介:ThreadPool 是一个线程池,当你需要开启 n 个线程时候,只需把这个指令抛给线程池,它将自动分配线程进行处理,它诞生于.Net 2.0 时代。
ThreadPool 与 Thread 的区别:
①:Thread 每开启一个异步任务,就需要使用一个 Thread,具有专一性,即使 Thread 已经死掉,仍然需要占用资源。
②:ThreadPool 能实现 n 个线程处理 n+m 个异步任务,且没有死线程,默认都是初始化的。
二. 深究 ThreadPool 类
1:QueueUserWorkItem 方法,将方法排入队列以便开启异步线程,它有两个重载。
a:QueueUserWorkItem(WaitCallback callBack),WaitCallback 是一个有一个 object 类型参数且无返回值的委托
b:QueueUserWorkItem(WaitCallback callBack, object state),WaitCallback 是一个有一个 object 类型参数且无返回值的委托,state 即 WaitCallback 中需要的参数, 不推荐这么使用,存在拆箱装箱的转换问题,影响性能。
使用方式:
a:严格的卡定义的写法,第一个重载和第二个重载均是处理有一个参数的函数,大于一个参数需要封装一个实体类,所需参数在实体类的构造函数中引入,然后调用第一个重载即可.
(不推荐这种写法)
通用写法: (可以处理任何参数个数的方法),这里不使用 n 即可。
ThreadPool.QueueUserWorkItem((n) =>
{
TestThread2(i.ToString(),i.ToString());
});
通用写法的简化版:
ThreadPool.QueueUserWorkItem(n => TestThread2(i.ToString(), i.ToString()));
代码如下:
![](https://static001.geekbang.org/infoq/f2/f2baa780c602d7234931db772c7a38e4.png)
2:线程等待(有局限性的)
利用 ManualResetEvent 类和 WaitOne 方法,多个线程的话需要写 for 循环。
![](https://static001.geekbang.org/infoq/54/540fabde6438dfc1844f04a2d24d69cd.png)
运行结果:
![](https://static001.geekbang.org/infoq/4d/4d3192d5ebd481fe30e9359ecb3cfefe.png)
更多 C++后台开发技术点知识内容包括 C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux 内核,TCP/IP,协程,DPDK 多个高级知识点。
C/C++Linux服务器开发高级架构师/C++后台开发架构师免费学习地址
【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击领取
![](https://static001.geekbang.org/infoq/21/21f15e2a467dc14fb80696bcecc3f93c.png)
3:常用方法
a:设置工作线程和 IO 线程的最大和最小值,SetMaxThreads 和 SetMinThreads。
b:获取工作线程和 IO 线程最大、最小、可用值,GetMaxThreads、GetMinThreads、GetAvailableThreads。
![](https://static001.geekbang.org/infoq/92/924194de44f2b3837e33b52e6bcd0172.png)
测试结果:
![](https://static001.geekbang.org/infoq/03/030776ad19a577a98bd9916f8845404d.png)
![](https://static001.geekbang.org/infoq/e1/e1c3d4e79dbff2ed5217ae565dff3799.png)
三. 扩展一个定时器功能
1:RegisterWaitForSingleObject 类,但是不常用.(涉及到定时任务,建议使用 Quartz.Net)
2:System.threading 命名空间下的 Thread 类,通过查看源码,构造函数中有四个参数,第一个是 object 参数的委托,第二个是委托需要的值,
第三个是调用 callback 之前延迟的时间量(以毫秒为单位)
第四个是 调用 callback 的时间间隔(以毫秒为单位)
原文链接:第三节:ThreadPool 的线程开启、线程等待、线程池的设置、定时功能 - Yaopengfei - 博客园
评论