参考:第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能 - Yaopengfei - 博客园 (cnblogs.com)
C# AppDomain 详解_勇于尝试,却要三思后行。-CSDN博客_appdomain
一、为什么用线程池
1、因为线程的创建需要内存,太多线程会造成内存浪费
2、因为线程的销毁都需要耗费时间,
3、因为线程的调度执行会涉及线程上下文的切换,太多的线程这个过程会消耗性能(线程的管理消耗会变大)
AppDomain、进程、线程关系:C# AppDomain 详解_勇于尝试,却要三思后行。-CSDN博客_appdomain
理论:
1、线程池的线程的数量最好由系统去分配,不要人为指定,因为线程池有一个内部机制:线程池创建一个线程去响应所有请求,当请求速度大于线程处理速度时,才会创建新的线程,
这样能在满足服务处理的情况下,最大程度减少线程开支,认为指定做不到这么精准高效
2、线程池的线程执行任务完毕后会返回线程池,进入空闲等待状态,等待响应其他请求,自身不会销毁,所以能减少性能损失。如果睡眠了太长时间,它会自己醒来,并销毁自身,允许系统回收线程使用的资源(包括内核对象、栈、TEB等)
3、线程池的线程默认为后台线程
4、线程池会快速创建工作者线程,使工作者线程的数量等于传给ThreadPool的SetMinThreads方法的值。如果从不调用这个方法(也建议你永远不调用这个方法),那么默认值等于你的进程允许使用的CPU数。
5、通常,你的进程允许使用机器上的所有CPU®,所以线程池创建的工作者线程数量很快就会达到机器上的CPU数。创建了这么多(CPU数量)的线程后,线程池会监视工作项的完成速度。
5.1如果工作项完成的时间太长(具体多长没有正式公布),线程池会创建更多的工作者线程。
5.2如果工作项的完成速度开始变快,工作者线程会被销毁。
Demo地址:
https://files.cnblogs.com/files/summerZoo/ThreadPoolStudy.zip?t=1646912799