多线程——ThreadPool
参考:第三节: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
多线程——ThreadPool的更多相关文章
- 多线程 ThreadPool线程池
简单说明一下: 线程池可以看做容纳线程的容器:一个应用程序最多只能有一个线程池:ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...
- [.net 多线程]ThreadPool的安全机制
ThreadPool类,有两个方法我们没有用到,UnsafeQueueUserWorkItem 和UnsafeRegisterWaitForSingleObject. 为了完全理解这些方法,首先,我们 ...
- [.net 多线程]ThreadPool
CancellationTokenSource tocken = new CancellationTokenSource(); ThreadPool.QueueUserWorkItem(param = ...
- Java多线程-ThreadPool线程池(三)
开完一趟车完整的过程是启动.行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速.频繁地踩刹车等动作.因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油. 而一个Java线程 ...
- Java多线程-ThreadPool线程池-2(四)
线程池是个神器,用得好会非常地方便.本来觉得线程池的构造器有些复杂,即使讲清楚了对今后的用处可能也不太大,因为有一些Java定义好的线程池可以直接使用.但是(凡事总有个但是),还是觉得讲一讲可能跟有助 ...
- 多线程二:线程池(ThreadPool)
在上一篇中我们讲解了多线程的一些基本概念,并举了一些例子,在本章中我们将会讲解线程池:ThreadPool. 在开始讲解ThreadPool之前,我们先用下面的例子来回顾一下以前讲过的Thread. ...
- C#多线程编程笔记
在开发中经常有遇到因为程序执行的时间过长,而造成程序假死的情况,这是因为我们的程序是同步执行的,当执行到需要长时间的操作时,程序就会等待当前的操作完成,从而造成程序假死.C#的异步与多线程就是为了解决 ...
- 城市经纬度 json 理解SignalR Main(string[] args)之args传递的几种方式 串口编程之端口 多线程详细介绍 递归一个List<T>,可自己根据需要改造为通用型。 Sql 优化解决方案
城市经纬度 json https://www.cnblogs.com/innershare/p/10723968.html 理解SignalR ASP .NET SignalR 是一个ASP .NET ...
- 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)
数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...
- .NET(C#):await返回Task的async方法
众所周知,async方法只可以返回void,Task和Task<T>. 对于返回void的async方法,它并不是awaitable,所以其他方法不能用await方法来调用它,而返回Tas ...
随机推荐
- 探索未来之路,激发AI创新活力!“天翼云息壤杯”高校AI大赛北京区域赛开赛!
近年来,人工智能发展速度之快.辐射范围之广令人瞩目.今年的<政府工作报告>提出,深化大数据.人工智能等研发应用,开展"人工智能+"行动.AI充满了无限可能和潜力,未来还 ...
- Vegeta HTTP 负载测试工具
Go接口压测的第三方包,一个很好用的负载测试工具.vegeta测试工具组件(可执行文件)支持linux以及mac系统,这里指的是通过终端命令行进行进行测试,不需要从代码层面使用这个工具的时候支持lin ...
- 快速 log2 取整算法 (O(1) 时间与空间复杂度)
先上核心代码(文末附针对多种整数类型的代码): inline int log_2(int x) { int rst = 0; if (x & 0xffff'0000U) rst += 16, ...
- Linux mint安装百度云
deb包下载 BCloud 作者官网https://github.com/XuShaohua/bcloud-packages 链接: https://pan.baidu.com/s/1hskY04G ...
- RFID基础——高频RFID协议、读写模块和标签
RFID技术中的低频.高频.超高频有各自的优点和应用场景.其中,与我们个人生活息息相关的门禁卡.公交卡.身份证.图书标签主要用到的是高频RFID.这些应用也对应着高频RFID中不同的协议. 高频RFI ...
- kubesphere应用系列(二)部署有状态服务redis
前言 在 Kubernetes 中,服务(Service)可以被分为有状态服务和无状态服务,个人认为的区别: 无状态服务是指不依赖于任何持久化状态的服务.它们通常是将请求处理为独立.无关的事务,并且在 ...
- 探秘Transformer系列之(9)--- 位置编码分类
探秘Transformer系列之(9)--- 位置编码分类 目录 探秘Transformer系列之(9)--- 位置编码分类 0x00 概述 0x01 区别 1.1 从直观角度来看 1.2 从模型处理 ...
- Easyexcel(5-自定义列宽)
注解 @ColumnWidth @Data public class WidthAndHeightData { @ExcelProperty("字符串标题") private St ...
- mysql - 存储过程及分支语句
存储过程是预编译好的sql语言的集合 减少编译次数,提高sql语句的重用性.但是在现阶段因为其维护困难及其他一系列的原因,有些时候并不推荐使用 创建 create procedure 存储过程的名字 ...
- 算法图解,关于数组,链表,以及大O表示法
有关数组.链表以及大O表示法 关于数组 [1] 连续性:数组在内存中连续储存,就像是看电影的一群人排排坐. [2] 易读性:数组中的元素可以随意读取. [3] 难改性:由于连续的特性,增减元素都会导致 ...