ThreadPool(线程池)大概的工作原理是,初始时线程池中创建了一些线程,当应用程序需要使用线程池中的线程进行工作,线程池将会分配一个线程,之后到来的请求,线程池都会尽量使用池中已有的这个线程进行响应,如果请求过多的话,线程池将会按照策略等待或者创建新的线程进行响应直到达到上限。当线程池中的线程处于空闲状态一定时间后(具体多少看环境)线程池池内的空闲线程将会进行自我终结。

1、CLR的一个进程内会维护一个线程池,线程池被该进程内所有应用程序域共享。托管线程池中的线程为后台线程, 即线程的IsBackground属性为true。这意味着在所有的前台线程都已退出后,ThreadPool 线程不会让应用程序保持运行。

2、从.NET4.0开始,进程的线程池的默认大小由虚拟地址空间的大小等多个因素决定,它的默认大小为每个可用处理器250个辅助线程,再加上1000个I/O完成线程。进程可以调用 GetMaxThreads 方法以确定线程的数量。 使用 SetMaxThreads 方法可以更改线程池中的线程数。 每个线程使用默认的堆栈大小并按照默认的优先级运行。

3、线程池分为两类,一类是Work Thread(计算密集型),一类是IO Thread(IO密集型)。IO密集型线程可以在不占用CPU的情况下通过设备驱动程序进行IO操作,比如带BeginXXX和Endxxx方法的文件操作、网络访问等方法。这种带Begin/End的异步操作写法也就是熟知的Asynchronous Programming Model (APM)模式。使用APM模式,调用BeginInvoke却不调用EndInvoke会使得线程资源无法回收引发memory leak,高并发条件下会造成应用程序崩溃。

4、委托的BeginInvoke方法,本质上也是通过线程池完成工作的,所以我们熟知的Func、Action等委托,通过BeginInvoke的方式异步调用方法,必须要写对应的callback,因为调用BeginInvoke却不调用EndInvoke会使得线程资源无法回收。

5、并行开发TPL技术背后离不开ThreadPool,FCL的Task在线程池的基础上进行了优化,并提供了更多更强大且方便的功能,如Task支持线程的取消、完成、失败通知等交互性操作,以及支持线程执行的先后次序。

6、.NET4.5自带的async和await,就是基于.NET4.0里的Task和Parallel的再开发,归根结底是调用Task的语法糖,它们的实现也离不开线程池在背后的工作。

7、在线程池中调用Thread.Sleep方法会导致该线程池中的某工作线程挂起,无法回到池中,当然无法处理其他任务,也就是说这个线程此时只是在休息,不能干其他活。

8、在多线程、异步及并行操作中,异常处理必须非常小心,如果不捕获会导致该线程所属进程崩溃。

参考:

http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

http://msdn.microsoft.com/en-us/library/hh191443.aspx

http://www.cnblogs.com/yuyijq/category/278984.html

http://stackoverflow.com/questions/5264836/in-net-4-does-begininvoke-and-task-use-the-same-threadpool

<<CLR via C#>>

转载于:https://www.cnblogs.com/jeffwongishandsome/p/use-threadpool-experiences.html

线程池ThreadPool知识碎片和使用经验速记相关推荐

  1. C#.Net使用线程池(ThreadPool)与专用线程(Thread)

    线程池(ThreadPool)使用起来很简单,但它有一些限制: 1. 线程池中所有线程都是后台线程,如果进程的所有前台线程都结束了,所有的后台线程就会停止.不能把入池的线程改为前台线 程. 2. 不能 ...

  2. C# 线程池ThreadPool

    什么是线程池?为什么要用线程池?怎么用线程池? 1. 什么是线程池? .NET Framework的ThreadPool类提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 I/O.代表其他 ...

  3. 手撕线程池 ThreadPool

    为了更加方便理解线程池 我们都知道线程池和任务就好比生产者消费者之间的关系也就是如图! 先分析:我们可以将线程池中的线程看作消费者,可以将main(只是方便测试)看作生产者 总体思路: 实现一个阻塞队 ...

  4. threadpool的数量_多线程之旅(11)_如何限制系统线程池ThreadPool的最大最小并发数量_SetMaxThreads/SetMinThreads用法...

    ThreadPool有两个设置线程池并发数量的方法,分别是: ThreadPool.SetMinThreads(int workerThreads, int completionPortThreads ...

  5. 线程池(ThreadPool)

    线程池ThreadPool 1.线程池简介 2.线程池参数说明(重点) 2.1 常用参数说明 2.2 拒绝策略(重点) 3.线程池底层工作原理 4.入门案例 1.线程池简介   线程池(英语:thre ...

  6. Java线程池ThreadPool详解

    Java线程池ThreadPool详解 1. 线程池概述 1.1 线程池简介 1.2 线程池特点 1.3 线程池解决问题 2. 线程池原理分析 2.1 线程池总体设计 2.6 线程池流转状态 2.2 ...

  7. 【ElasticSearch】es 线程池 ThreadPool 的封装

    文章目录 1.概述 2.线程池在何时初始化 3.构建线程池框架 3.1 初始化ExecutorBuilder集合 3.1.1 构造函数 3.1.1.1 普通操作的Executor 3.1.1.2 索引 ...

  8. C# 多线程 线程池(ThreadPool) 2 如何控制线程池?

    线程池启动了,但是没有方法去控制线程池,如果子线程出现了问题,难道线程池就死了吗? 我们可以设置线程池的线程数量,进行加入任务,线程池会自动分配并且合理的执行,但是控制不了又有啥意思呢. 线程池里线程 ...

  9. 简单使用Boost线程池threadpool

    场景: 1.在一些多线程的程序中,比如服务端响应请求时,可以同时响应多个客户端的请求,但是响应请求的个数(即线程)的个数过多的话就会造成系统资源损耗过多而宕机,还比在做一些下载的程序时,可同时开5个下 ...

最新文章

  1. WannaCry的UWP版,哈哈哈
  2. Python手动编程实现斐波那契数列
  3. [布局] bootstrap基本标签总结
  4. eclipse配置了maven,项目报错
  5. 阿里巴巴开源项目nginx_concat_module企业部署实例
  6. 这款插件不既有Chrome版【飞秋下载】
  7. 第一课[编辑器设置-VC++6.0]
  8. (88)Verilog HDL系统函数和任务:$fdisplay
  9. SwitchyOmega规则列表地址
  10. linux mp4box安装,视频处理利器 MP4Box常用的12个命令
  11. Linux软件安装方法之rpm包安装
  12. 【排序算法】基数排序:LSD 与 MSD
  13. 树莓派做网络代理_树莓派使用Proxy代理
  14. 看代码,学strings包
  15. 携手NVIDIA等40余家国内外伙伴,飞桨硬件生态狂飙
  16. 国内三大B2C网站首页的信息架构【收集整理,本人非原作者】
  17. Hadoop-感知网络布局和机架的设计
  18. c语言农历的算法,农历两百年算法(1901~2100)【c语言代码】
  19. QGC增加 google中国地图
  20. 禁用迅雷的浏览器支持

热门文章

  1. ssm+mysql+jsp打造在线考试系统WeKnow-学生端
  2. Mybatis【一对多、多对一、多对多】知识要点
  3. 2015年第11本:代码整洁之道Clean Code
  4. css使用1-搜狐浏览器和chrome浏览器不同点记录
  5. 【Oracle 常用查询】oracle表空间使用率统计查询
  6. .NET LINQ 筛选数据
  7. ZedGraph:一个同时支持WinForm和WebForm的开源图表控件(基于LGPL协议,.NET 2.0 C#源代码)...
  8. 接口转发和重定向区别(三)
  9. Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
  10. 算法--------删除重复元素,但保留两个