关于.net framework 线程池的理解

线程池是C#并行开发的基础,C#中的Task、委托的异步等,内部使用的都是线程池。线程池中所有的线程都是后台线程。

线程池顾名思义,拥有一定数量的活动线程,供程序调用。在windows系统中,进程是程序资源的集合,线程则是真正的执行单元,如果一个主机有多个逻辑CPU,程序就可以并行运行。但是建立线程需要耗费时间,消耗内存,如果频繁的建立和销毁会很影响程序性能。线程池机制则可以很好的弥补这一点。当使用线程池执行异步任务时,任务调度器会将任务放到线程池中的线程中执行,任务完成后也不会销毁线程,而是继续等待执行用户的其他任务。如果线程池中的线程都在执行任务,则线程池就会建立新的线程。

            //获得最小线程数
            int minWorkerThread, minPortThread;
            ThreadPool.GetMinThreads(out minWorkerThread, out minPortThread);
            Console.WriteLine(minWorkerThread.ToString()+"  "+ minPortThread.ToString());

            //获得最大线程数
            int maxWorkerThread, maxPortThread;
            ThreadPool.GetMaxThreads(out maxWorkerThread, out maxPortThread);
            Console.WriteLine(maxWorkerThread.ToString() + "  " + maxPortThread.ToString());

            //获得可以建立的线程数(即最大线程数和线程池中已经存在的线程数的差值)
            int availableWorkerThread, availablePortThread;
            ThreadPool.GetAvailableThreads(out availableWorkerThread, out availablePortThread);
            Console.WriteLine(availableWorkerThread.ToString() + "  " + availablePortThread.ToString());

线程池线程设置有最小线程数和最大线程数,最小线程数一般和逻辑CPU数量相当。而最大线程数,在.net4.0中分别是32767(工作线程),1000(IO线程)。最大线程数和最小线程数可以设置。当线程池中的线程数量低于最小线程数时,如果此时需要新的线程,会立即建立。而当大于最小线程数时,线程池会等待500毫秒来观察是否需要建立新的线程。所以此时建立新的线程的时间会大于500毫秒。当已经达到最大线程数时,就不会再建立新的线程。如果有新的任务,线程池会让任务排队等待,直到有可用的线程。另外,当线程池线程空闲时,一定的时间后会自动销毁。

线程池一般用来执行时间较短、对任务的开始执行时间和执行顺序要求不严格的任务,这样能最大限度的利用线程池的优势。另外,超过最小线程数时建立新的线程时间会大于500毫秒,可以根据需要修改线程池线程最小线程数量来满足程序的实际需要。

            // 在这里只设置工作线程
            //根据需要设置
            int appMinThreadCount =5;

            //获得最小线程数
            int minWorkerThread, minPortThread;
            ThreadPool.GetMinThreads(out minWorkerThread, out minPortThread);

            if (appMinThreadCount > minPortThread)
            {
                var result=ThreadPool.SetMinThreads(appMinThreadCount, minPortThread);
                //返回值用来判断是否设置成功
                Console.WriteLine(result);
            }
时间: 2024-09-30 10:03:00

关于.net framework 线程池的理解的相关文章

我对python线程池的理解

#!/usr/bin/env pythonfrom Queue import Queuefrom threading import Threadimport randomimport time def person(i,q):    while True:  #这个人一直处与可以接活干的状态        q.get()        print "Thread",i,"do_job"        time.sleep(random.randint(1,5))#每

Linux下线程池的理解与简单实现

首先,线程池是什么?顾名思义,就是把一堆开辟好的线程放在一个池子里统一管理,就是一个线程池. 其次,为什么要用线程池,难道来一个请求给它申请一个线程,请求处理完了释放线程不行么?也行,但是如果创建线程和销毁线程的时间比线程处理请求的时间长,而且请求很多的情况下,我们的CPU资源都浪费在了创建和销毁线程上了,所以这种方法的效率比较低,于是,我们可以将若干已经创建完成的线程放在一起统一管理,如果来了一个请求,我们从线程池中取出一个线程来处理,处理完了放回池内等待下一个任务,线程池的好处是避免了繁琐的

线程池 概念理解

转 Java线程池解析 作者 whthomas 关注 2016.04.06 20:07* 字数 1427 阅读 340评论 0喜欢 8 Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 屏幕快照 2016-04-06 下午2.01.16.png 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolExecutor和ForkJoinPool. ForkJoinPool是Fork/Join框架下使用的一个线

关于 Tomcat 的线程池的理解

默认配置下,Tomcat 会为每个连接器创建一个绑定的线程池(最大线程数 200).在大多数情况下你不需要改这个配置(除非增大最大线程数以满足高负载需要).但是 Tomcat 喜欢在每个工作者线程的 thread-local 上下文缓存一些诸如 PageContext 以及标签缓存的对象.正因如此,就会有你期望 Tomcat 能够将线程关掉以清理出来一些内存的情况.此外,每个连接器维护自己的线程池的话,根据服务器的承受能力来设置一个(线程数)最高值会变得更加困难.解决这些问题的答案就是使用一个共

java中线程池的理解和使用

看过很多关于线程的文章,但还是觉得需要说些什么. 我只想说使用线程池的时候,就不要自己写队列和循环等东西了. 代码如下: 1 public class SqlLogRecorder { 2 private static Logger logger = LoggerFactory.getLogger(SqlLogRecorder.class); 3 4 public SqlLogRecorder(MSConfigManager configManager){ 5 // 可以根据需要创建不同类型的连

java线程池ThreadPoolExecutor理解

Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有

线程池的理解与简单实现

池 由于服务器的硬件资源"充裕",那么提高服务器性能的一个很直接的方法就是以空间换时间,即"浪费"服务器的硬件资源,以换取其运行效率.这就是池的概念. 池是一组资源的集合,这组资源在服务器启动之初就被创建并初始化,这称为静态资源分配. 当服务器进入正式运行阶段,即开始处理客户请求的时候,如果它需要相关的资源,就可以直接从池中获取,无需动态分配.很显然,直接从池中取得所需资源比动态分配资源的速度要快得多,因为分配系统资源的系统调用都是很耗时的. 当服务器处理完一个客户

Java线程池理解

线程池原理理解 作用: 线程池的作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果: 少了浪费系统资源,多了造成系统拥挤效率不高. 用线程池控制线程数量,其他线程排队等候.一个任务执行完毕,再从队列中取最前面的任务开始执行. 若队列中没有等待进程,线程池的这一资源处于等待. 当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了:否则进入等待队列. 为什么要用线程池: 1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用

Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解. [size=1.8em]Handler+Runnable模式 我们先看一个并不是异步线程加载的例子,使用 Handler+Runnable模式. 这里为何不是新开线程的原因请参看这篇文章:Android Runnable 运行在那个线程 这里的代码其实是在UI 主线程中下载图片的,而不是新开线程. 我们运行下面代码时,会发现他其实是阻塞了整个界面