ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# ThreadPool类(线程池)

2022-04-03 14:04:12  阅读:224  来源: 互联网

标签:C# ThreadPool 线程 QueueUserWorkItem WaitCallback CPU CLR


C# ThreadPool类(线程池)

CLR线程池并不会在CLR初始化时立即建立线程,而是在应用程序要创建线程来运行任务时,线程池才初始化一个线程。

线程池初始化时是没有线程的,线程池里的线程的初始化与其他线程一样,
但是在完成任务以后,该线程不会自行销毁,而是以挂起的状态返回到线程池。
直到应用程序再次向线程池发出请求时,线程池里挂起的线程就会再度激活执行任务。
这样既节省了建立线程所造成的性能损耗
可以让多个任务反复重用同一线程,从而在应用程序生存期内节约大量开销。
通过CLR线程池所建立的线程总是默认为后台线程,优先级数为ThreadPriority.Normal。//Normal:正常的

 

CLR线程池分为工作者线程(workerThreads)与I/O线程(completionPortThreads)两种:

 

工作者线程(workerThreads)是主要用作管理CLR内部对象的运作,通常用于计算密集的任务I/O(Input/Output)线程主要用于与外部系统交互信息,
如输入输出,CPU仅需在任务开始的时候,将任务的参数传递给设备,然后启动硬件设备即可。
等任务完成的时候,CPU收到一个通知,一般来说是一个硬件的中断信号,此时CPU继续后继的处理工作。
在处理过程中,CPU是不必完全参与处理过程的,如果正在运行的线程不交出CPU的控制权, 那么线程也只能处于等待状态,即使操作系统将当前的CPU调度给其他线程,此时线程所占用的空间还是被占用, 而并没有CPU处理这个线程,可能出现线程资源浪费的问题

 

 

如果这是一个网络服务程序,每一个网络连接都使用一个线程管理,可能出现大量线程都在等待网络通信,
随着网络连接的不断增加,处于等待状态的线程将会很消耗尽所有的内存资源。可以考虑使用线程池解决这个问题。  

线程池的最大值一般默认为1000、2000。当大于此数目的请求时,将保持排队状态,直到线程池里有线程可用。

 

使用CLR线程池的工作者线程一般有两种方式:

通过ThreadPool.QueueUserWorkItem()方法;
通过委托;

要注意,不论是通过ThreadPool.QueueUserWorkItem()还是委托,调用的都是线程池里的线程。

通过以下两个方法可以读取和设置CLR线程池中工作者线程与I/O线程的最大线程数。
ThreadPool.GetMax(out in workerThreads,out int completionPortThreads);
ThreadPool.SetMax(int workerThreads,int completionPortThreads);

 

查看线程池中有多少线程正在投入使用:
可以通过ThreadPool.GetAvailableThreads(out in workThreads,out int conoletionPortThreads)方法。

方法    说明
GetAvailableThreads    剩余空闲线程数
GetMaxThreads          最多可用线程数,所有大于此数目的请求将保持排队状态,直到线程池线程变为可用
GetMinThreads          检索线程池在新请求预测中维护的空闲线程数
QueueUserWorkItem      启动线程池里得一个线程(队列的方式,如线程池暂时没空闲线程,则进入队列排队)
SetMaxThreads          设置线程池中的最大线程数
SetMinThreads          设置线程池最少需要保留的线程数

 

使用线程池有如下优点

 

1、缩短应用程序的响应时间。因为在线程池中有线程的线程处于等待分配任务状态(只要没有超过线程池的最大上限),无需创建线程。
2、不必管理和维护生存周期短暂的线程,不用在创建时为其分配资源,在其执行完任务之后释放资源。
3、线程池会根据当前系统特点对池内的线程进行优化处理。

总之使用线程池的作用就是减少创建和销毁线程的系统开销。在.NET中有一个线程的类ThreadPool,它提供了线程池的管理。

 

ThreadPool是一个静态类,它没有构造函数,对外提供的函数也全部是静态的

 

//将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。
public static bool QueueUserWorkItem(WaitCallback callBack)

//将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
public static bool QueueUserWorkItem(WaitCallback callBack,Object state)

QueueUserWorkItem方法中使用的的WaitCallback参数表示一个delegate,它的声明如下:
public delegate void WaitCallback(Object state)

如果需要传递任务信息可以利用WaitCallback中的state参数,类似于ParameterizedThreadStart委托。

 

标签:C#,ThreadPool,线程,QueueUserWorkItem,WaitCallback,CPU,CLR
来源: https://www.cnblogs.com/ZkbFighting/p/16095737.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有