线程池的简要扫盲

来源:互联网 发布:linux下禅道部署方法 编辑:程序博客网 时间:2024/06/17 06:24

前言

2016年10月29日,面试思科的C++软件开发工程师时,被问到关于线程池的概念及实现原理。当时自己本身理解的很模糊,当然回答的肯定也不好了。下面是一些查阅的知识及个人见解,就当是扫盲了。遇到问题,学习,进步,我觉得这种学习状态很好。

何为“池”?

以web服务器举例:

web服务器完全有可能会同时并发处理很多来自客户端的大量短小的任务。那么以服务器工作模式的一个简单模式来讲解:每当一个新的请求到达,服务器就创建一个服务对象为之服务;然而当有大量请求并发的访问服务器时,服务器频繁的创建和销毁对象的开销会很大。所以,很容易想到处理这种情况的方法的出发点可以是:大限度的减少创建和销毁对象的次数。基于以上情况,引入了“池”的概念。这样就是的可以定制一定的资源,对这些资源进行复用,避免频繁的创建和销毁。这样可以很大程度的提高服务器并发处理的能力。

一句话:创建了以后,不用了放回池子里,要用的时候再去拿。

线程池的原理

多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。

假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。
如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。

线程池在任务还没有到来之前,创建一定数量的线程,放入空闲队列中,这些线程处于休眠状态,占用极少量的内存空间。当有请求到来时,线程池给这个请求分配一个空闲线程,把请求传入此线程进行处理。

当线程池内没有空闲线程时,线程池是可以自由创建一定数量的新线程的,用于处理别的请求。但是当系统比较闲的时候,线程池也可以销毁一定量的线程。

关于线程池

1:线程池所创建的线程优先级都是一样的,所以需要使用特定线程优先级的任务不宜使用线程池。
2:线程池不是什么时候都要用的,它也是一种资源,用的不对可能并不会带来性能上的提高。当有一堆任务(对象)需要创建线程去执行,那么此时就用线程池,如果仅仅就三两个线程,那是没必要的。其实线程池,主要是降低了线程创建和销毁的时间开销。

一句话:当有很多线程需要频繁执行时,且创建和销毁线程的开销比线程处理请求的开销大时,考虑用线程池。

以上仅仅是知识扫盲罢了,并没有多深入。抛砖引玉。至少面试的时候没讲得这么细致及深入。共勉

0 0
原创粉丝点击