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

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

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

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

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

线程池是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. Java面试中的Spring方面问题

    1.一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? VersionFeatureSpring 2.5发布于 2007 年.这是第一个支持注解的版本.Spring 3 ...

  2. [linux] 查看网卡UUID

    virtualbox复制了虚拟机,重新初始化网卡后,需要对/etc/sysconfig/network-scripts/ifcfg-eth0更新UUID值,虽然不改暂时也没发现有问题. 网上查找需要n ...

  3. Git初用心得

    第一次使用git,因为之前操作系统的实验需要,在虚拟机中使用过lniux系统,所以对这种用指令输入而不是图形化的程序感觉不是很陌生.感觉git还是很人性化的,git gui就是图形界面,操作起来也不复 ...

  4. IT小小鸟读书笔记(3.9)

    对于IT小小鸟呢,我也不知道怎么说,或许一开始我就没想到这是一本集合了众多从事IT工作人员的学习,求职经历.读完这本书,说没什么感触,或许连我自己也不太相信. 在书的一开始邹欣就有说到:兴趣是第一原则 ...

  5. TCP 连接管理

    实验代码和内容:https://github.com/ZCplayground/Understanding-Unix-Linux-Programming/tree/master/11.socket 明 ...

  6. Internet History, Technology and Security (Week3)

    Week3. Welcome to week 3! This is our fourth and final week of History where we make the connection ...

  7. Tuscany glossary of terms

    SOA(service-oriented architecture) 面向服务的架构 解决问题:面向服务.多语言.多种数据格式.多协议 SCA(Service Component Architectu ...

  8. Socket 记录

    心跳检测步骤:1客户端每隔一个时间间隔发生一个探测包给服务器2客户端发包时启动一个超时定时器3服务器端接收到检测包,应该回应一个包4如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器5如果 ...

  9. ASP.NET MVC 4.0 参考源码索引

    http://www.projky.com/asp.netmvc/4.0/Microsoft/AspNet/Mvc/Facebook/FacebookAppSettingKeys.cs.htmlhtt ...

  10. 学习jenv

    背景 生活不只是眼前的苟且, 还有诗和远方. 上个月工作需要启动了一个小项目, 按最初的计划会用JDK8. 但当计划报上去后, 运维部门出于后续升级维护的考虑, 不允许使用已经出来4年多的JDK8了, ...