什么是线程池

大家都知道,我们在打开一个应用的时候,操作系统是要做很多的事情的,动态链接、装载、分配虚拟空间、等等等等,其实一个应用的打开同时也伴随着一个进程的建立。

进程的建立是需要时间的,在进程上开线程也是需要消耗CPU时间,操作系统需要分配给新开的线程地址空间、栈空间、寄存器等,在线程结束的时候,操作系统又将这些东西回收(着同样需要消耗时间)。

所以我们在多线程的处理中如果遇到要很多次地开启线程去处理一些很简单但是要求应答速度快的任务。我们就可以把以前用过的线程拿出来重新使用,而不用每次都创建分别那些地址空间和寄存器。所以我们的任务如果对线程创建的效率要求很高的话(比如服务器对客户端的应答),就可以考虑使用线程池。


C#已经在自己的库中实现了内存池,其命名空间如下:

using System.Threading;

然后你无需自己建立线程,只需把你要做的工作写成函数,然后作为参数传递给ThreadPool.QueueUserWorkItem()方法就行了,传递的方法就是依靠WaitCallback代理对象,而线程的建立、管理、运行等工作都是由系统自动完成的,你无须考虑那些复杂的细节问题。

听起来很棒吧,但是在使用线程池之前,我们要先了解一下线程池的好处和缺陷

缺陷

  • ThreadPool类提供一个由系统维护的线程池(可以看作一个线程的容器),该容器需要 Windows 2000 以上系统支持,因为其中某些方法调用了只有高版本的Windows才有的API函数。
  • ThreadPool类是一个静态的类,你不能也不需要生成它的对象。而且一旦使用该方法在线程池中添加了一个项目,那么该项目将是无法取消的。
  • 你无法对线程池中的线程进行操作

好处

你无需自己建立线程,只需把你要做的工作写成函数,然后作为参数传递给ThreadPool.QueueUserWorkItem()方法就行了,传递的方法就是依靠WaitCallback代理对象,而线程的建立、管理、运行等工作都是由系统自动完成的,你无须考虑那些复杂的细节问题。

如果你理解了线程池的好处和坏处还是决定去使用,以下为一个示例代码:

using System;
using System.Threading; namespace threadTest
{
class Program
{
public delegate void func(object ob);
public object objLock=new object();
public void Run(object c)
{
int num;
int.TryParse(c.ToString(), out num);
for (int i = ; i < num; i++)
{
lock (objLock)
{
Console.WriteLine("now num is {0} print {1} ", num, i);
}
}
}
static public void Main()
{ bool isOk = false;
Program p = new Program();
try
{
//加入线程池,执行这个任务
ThreadPool.QueueUserWorkItem(new WaitCallback(p.Run), );
isOk = true; }
catch (NotSupportedException e)
{
Console.WriteLine("this API is not running on non-Windows 2000 system");
isOk = false;
}
if (isOk)//如果当前系统支持ThreadPool
{
for (int i = ; i < ; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(p.Run), i);
}
}
Console.ReadKey();
}
}
}

转载至https://blog.csdn.net/codedoctor/article/details/74614827

C#线程池 ThreadPool的更多相关文章

  1. 线程池ThreadPool的初探

    一.线程池的适用范围 在日常使用多线程开发的时候,一般都构造一个Thread示例,然后调用Start使之执行.如果一个线程它大部分时间花费在等待某个事件响应的发生然后才予以响应:或者如果在一定期间内重 ...

  2. C#多线程学习 之 线程池[ThreadPool](转)

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  3. 高效线程池(threadpool)的实现

    高效线程池(threadpool)的实现 Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们.在网络编程中,一般都是基于Reactor线 ...

  4. 多线程系列 线程池ThreadPool

    上一篇文章我们总结了多线程最基础的知识点Thread,我们知道了如何开启一个新的异步线程去做一些事情.可是当我们要开启很多线程的时候,如果仍然使用Thread我们需要去管理每一个线程的启动,挂起和终止 ...

  5. C# -- 使用线程池 ThreadPool 执行多线程任务

    C# -- 使用线程池 ThreadPool 执行多线程任务 1. 使用线程池 class Program { static void Main(string[] args) { WaitCallba ...

  6. 多线程Thread,线程池ThreadPool

    首先我们先增加一个公用方法DoSomethingLong(string name),这个方法下面的举例中都有可能用到 #region Private Method /// <summary> ...

  7. C# 线程池ThreadPool的用法简析

    https://blog.csdn.net/smooth_tailor/article/details/52460566 什么是线程池?为什么要用线程池?怎么用线程池? 1. 什么是线程池? .NET ...

  8. 多线程系列(2)线程池ThreadPool

    上一篇文章我们总结了多线程最基础的知识点Thread,我们知道了如何开启一个新的异步线程去做一些事情.可是当我们要开启很多线程的时候,如果仍然使用Thread我们需要去管理每一个线程的启动,挂起和终止 ...

  9. C#多线程学习 之 线程池[ThreadPool]

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  10. 线程池ThreadPool的常用方法介绍

    线程池ThreadPool的常用方法介绍 如果您理解了线程池目的及优点后,让我们温故下线程池的常用的几个方法: 1. public static Boolean QueueUserWorkItem(W ...

随机推荐

  1. js确定取消—js确定取消判断

    国瑞前端: js确定取消,在html界面中,有css模拟的模态框,这样显示的就会更好看一些,那么javascript有没有自带的弹框呢,当然是有的,接下来我就来给大家介绍一下把: js确定取消-警告框 ...

  2. cookielib模块 for python3

    python2 可以直接安装cookielib模块 而py3却不能安装 故需要安装http模块 举例子: from http import cookiejar cookie = cookiejar.C ...

  3. QT5的QChart使用记录

    如果需要在QT中使用QChart类,需要在安装的时候勾选QChart选项,在工程的 .pro 文件里面添加 QT += charts 语句,包含 QChart 头文件就行了. 对于图表的显示,可以先拖 ...

  4. checkbox之全选和反选

    先导入jquery组件 <input type="checkbox" id="checkall">全选<input type="ch ...

  5. AGC037

    Contest page A Tag:贪心 猜想段的长度只会有$1$和$2$(感性理解,应该可以反证--),然后就可以DP/贪心了 B Tag:贪心.组合 考虑如何构造合法方案.从右往左考虑球,因为当 ...

  6. [cf 585 E] Marbles

    (一道Div2E不会,我太难了) 题意: 给你一个长度为$n$的颜色序列$A$,每次操作可以选择两个相邻元素交换,求把序列交换成“相同颜色挨在一起”所需的最少操作数. 按颜色排序:设颜色$col$在序 ...

  7. 通过对比ASCII编码来理解Unicode编码

    Unicode是个规范,可以理解为一个索引表,世界上所有字符基本上在这个索引表中都能找到唯一一个数码与之对应,就像ASCII码表一样,也是一个规范,也可以看成是一个索引表,所有的英文字符都可以在这个索 ...

  8. nodejs的交互式解释器模式常用命令

    node - 进入交互器交互器解释模式 ctrl + c - 退出当前终端 ctrl + c 按下两次 - 退出 Node REPL ctrl + d - 退出 Node REPL 向上/向下 键 - ...

  9. C# vb .net实现焦距淡色特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的焦距淡色效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  10. ASP.NET SignalR 系列(五)之群组推送

    在上一章介绍了 一对一推送的方式,这章重点介绍下群组推送和多人推送 群组主要就是用到了方法:Groups.Add(Context.ConnectionId, groupName); 将不同的连接id加 ...