线程的创建和销毁都要耗费大量的时间,有什么更好的办法?用线程池!

太多的线程浪费内存资源,有什么更好的办法?用线程池!

太多线程有损性能,有什么更好的办法?用线程池!(⊙_⊙)?

线程池是什么?继前三篇线程基础之后,我们要来学学线程池了。注意,这些信息相当有用!

为了设计和实现可伸缩的、可响应的和可靠的应用程序或组建,线程池是你必须采用的核心技术。

线程池是CLR的,线程池自动为你管理线程的创建和销毁,线程池创建的一组线程将为各种任务而重用,极大提高了使用线程的成本,这也就意味着,你的应用程序其实只需要几个线程即可完成全部工作。

大概的讲了一下,来看看线程池的细节:

  大家可以想象一下:一个应用程序就好比一个抽屉,抽屉里面放了你分好类的东西,抽屉里面的"某一个东西"就好比这个应用程序的线程集合,这个抽象集合就是一个CLR。假如要抢救财物,你会选择拿抽屉里的东西还是拿抽屉呢?

好了,有了模型就好介绍CLR了,每个CLR都有它自己的线程池,这个线程池在应用程序域中共享。如果一个进程中加载了多了CLR,那么每个CLR都有它自己的线程池,有点抽象(─.─|||,很难解释清楚- -。多看几次,会领会这个意思的。)

  CLR在初始化的时候,线程池中没有是线程的。它的内部,线程池维护着一个操作请求队列。在应用程序想执行一个异步操作时,就会有发送一个需要调用某个方法的”记录项“,这个“记录项”会追加到线程池的队列中,然后线程池的代码从这个记录项中提取记录,为记录项分配给一个线程池线程。如果线程池中没有线程,就创建一个新的线程。

  创建线程会消耗一些资源(前面提到过了),当线程完成任务之后,线程不会被销毁,它从哪里来回哪里去(回到线程池,在那里进入空闲状态,等待下一次命令),由于线程不会被销毁,所以不再产生额外的性能损失。

  现在疑问来了!如果应用程序发出许多请求,会怎么办?

  线程池会尝试只用一个线程来服务所有的请求。然而,如果应用程序发出请求的速度超过了线程池处理它们的速度,线程池就会十分人性话的加”雇用兵“,创建额外的线程。到最后,应用程序的有请求都能由少量线程处理,不会存在太多的线程,不会浪费额外的性能。

  现在我们又会觉得,如果线程池真的有很多“雇佣兵”了,怎么办? 不照样是浪费了吗?

  其实这个已经考虑了,一个“雇佣兵”太久接不到活怎么办?空闲的线程多了,线程会自己醒来,来终止自己以释放资源。

  不是吧?终止线程也会产生性能损失啊!说好的解决性能损失呢??

  哈哈,线程闲的蛋疼了,还有什么性能损失?这表明应用程序已经没有在做什么事情了,所以这个性能损失,问题不大。

  再来扯扯线程池概念,让大家易于理解。

  线程池可以只容纳少量线程,从而避免资源浪费;也可以容纳更多线程,以利用多处理器,超线程处理器和多核处理器。它能在这两种不同的状态之间从容切换。

  线程池是启发式的。只要硬件支持,比如有多个CPU,线程池就会创建更多的线程。如果应用程序的负载减轻,线程池线程就会终结它们自己。

  线程池讲自己的线程划分为工作者线程和I/O线程。工作者线程是执行异步操作的执行线程,而I/O线程则用于通知你一个异步操作任务已经完成。

写了一大串概念性的东西,来使用一下线程池吧^_^。

  初用线程池,执行简单的计算限制操作:

 1         static void Main(string[] args)
2 {
3 Console.WriteLine("主线程启动");
4 ThreadPool.QueueUserWorkItem(StartCode,5);
5 Console.WriteLine("主线程运行到此!");
6 Thread.Sleep(1000);
7 }
8
9 private static void StartCode(object i)
10 {
11 Console.WriteLine("开始执行子线程...{0}",i);
12 Thread.Sleep(1000);//模拟代码操作
13
14
15 }

这个和第一篇的那个列子很相似。也很简单。要说的是,QueueUserWorkItem()中的参数:

必须匹配这个委托,我这个示例是用的第二个方法。

结果就像这样:

我的是双核处理器,主线程和子线程是同时运行的。

如果是单核的话,结果可能就不同了,因为这是Windows调试器决定先调度哪个线程控制不了~~~~

这主要介绍线程池,就这么多了。^_^

C#线程篇---你所不知道的线程池(4)的更多相关文章

  1. 你所不知道的 CSS 滤镜技巧与细节

    承接上一篇你所不知道的 CSS 动画技巧与细节,本文主要介绍 CSS 滤镜的不常用用法,希望能给读者带来一些干货! OK,下面直接进入正文.本文所描述的滤镜,指的是 CSS3 出来后的滤镜,不是 IE ...

  2. Java并发编程(您不知道的线程池操作)

    Java并发编程(您不知道的线程池操作) 这几篇博客,一直在谈线程,设想一下这个场景,如果并发的线程很多,然而每个线程如果执行的时间很多的话,这样的话,就会大量的降低系统的效率.这时候就可以采用线程池 ...

  3. Java并发编程(您不知道的线程池操作), 最受欢迎的 8 位 Java 大师,Java并发包中的同步队列SynchronousQueue实现原理

    Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchan ...

  4. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  5. 你所不知道的html5与html中的那些事第三篇

    文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...

  6. JavaScript中你所不知道的Object(二)--Function篇

    上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.Str ...

  7. 你所不知道的五件事情--java.util.concurrent(第二部分)

    这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇,仍然讲述了关于Java并发集合API的一些应用窍门,值得大家学习.(2010.06.17最后更新) 摘 ...

  8. 你所不知道的setInterval

    在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...

  9. 你所不知道的 CSS 阴影技巧与细节 滚动视差?CSS 不在话下 神奇的选择器 :focus-within 当角色转换为面试官之后 NPOI 教程 - 3.2 打印相关设置 前端XSS相关整理 委托入门案例

    你所不知道的 CSS 阴影技巧与细节   关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow  ...

随机推荐

  1. 配置idea

    http://www.cnblogs.com/yangyquin/p/5285272.html

  2. 奔跑吧DKY——团队Scrum冲刺阶段-Day 6

    今日完成任务 谭鑫:制作相应动画人物,并实现人物动画 黄宇塘:制作相应动画人物,并实现人物动画,制作背景图 赵晓海:制作相应动画人物,并实现人物动画 方艺雯:制作相应动画人物,并实现人物动画,编写博客 ...

  3. 奔跑吧DKY——团队Scrum冲刺阶段博客汇总

    第一周:团队展示 团队选题 需求规格说明书 第二周:完善需求规格说明书.制定团队编码规范.通过团队项目数据库设计 奔跑吧DKY--团队Scrum冲刺阶段-Day 1-领航 奔跑吧DKY--团队Scru ...

  4. C++:模板——函数模板1

    一.为什么使用函数模板 假设我们在程序中需要比较两个变量的大小,但变量的类型可能是int.float或者double,此时为了满足程序的要求我们可能会在程序中编写多个函数,如: //比较两个int型变 ...

  5. 冲刺One之站立会议4 /2015-5-17

    今天我们继续了昨天未完成的部分,把服务器端的在线人数显示做了出来,但是在调试的时候还有一些不可预知的自己也不会改的bug,让我们有点不知所措,启动时间的显示相对来说比较容易实现. 燃尽图4

  6. Beta后续感想/吐槽

    感想 磨人的软工实践终于结束了 艰难的度过了一学期,还是写点什么纪念一下吧. 大一大二的时候就听说软工实践是魔鬼般的锻炼,于是当年不知天高地厚的我是很期待的,终于,我大三了. 后来,我长大了. alp ...

  7. 在新的电脑上部署 Hexo,保留原有博客的方法

    用U盘从旧的电脑拷贝整个blog文件夹. 在新的电脑上装好git并配置好用户名和密钥. 安装 node.js 安装 hexo:npm install hexo-cli -g 用U盘把blog文件夹拷贝 ...

  8. sql中Union和union all的使用

    该文转载自:http://www.cnblogs.com/chaobaojun/archive/2009/12/24/1631508.html 在MS-SQL如果将两个或更多查询的结果组合为单个结果集 ...

  9. jQuery ajax - get() 方法

    AJAX = Asynchronous javaScript and XML.  AJAX 是一种创建快速动态网页的技术. AJAX 通过在后台与服务器交换少量数据的方式,允许网页进行异步更新.这意味 ...

  10. Intellij IDEA中file size exceeds configured limit解决

    把Hadoop源码导入IDEA中后,其中有个ClientNamenodeProtocolProtos文件代码高达82997行,IDEA直接就不把它当java类看了,报file size exceeds ...