线程池对象池连接池都是什么?

Posted 给产品经理讲技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池对象池连接池都是什么?相关的知识,希望对你有一定的参考价值。


你是否经常听到程序员说线程池,对象池,连接池等等和「」配合起来的词语?


这里面「池」就是你第一印象中想到的池子、池塘的意思,顾名思义,「**池」的意思就是将前面的定语若干个放在一个池塘里面,以备不时之需使用,为什么要这样设计呢?且听慢慢分解。


在计算机当中,资源是最宝贵的,不管创建一个线程,还是构建一个对象,或者建立一次数据库连接,都可以理解为在向整个系统申请资源。就像医院,医生的资源都是有限的,那谁到医院早,或者谁关系牛,或者谁花高价,谁就能获取到医生资源。


我们首先要认识到资源是宝贵的有限的,并不是随时申请随时都有。


既然获取到了一个资源,那就要最好充分利用,因为下次申请资源要花很大的代价,比如你彻夜未眠,搬了个小板凳,终于挂号到了一个老专家,你对他描述了症状,他说你得去抽个血,这个时候你屁颠屁颠的去验血,回来要重新挂号老专家,又要耗费同样的时间和成本,显然是十分不合理的。


这告诉我们,要重复利用“老专家”,才是节省成本的方式。例如在Linux上,最多也就能申请380多个线程,如果一些例行任务、或者很频繁很琐碎的事情需要开线程执行,那显然将会耗很多的资源,这种情况下,我们所做的设计就是「线程池」。


线程池通常会指定大小,比如设置线程池的大小是20个线程,我们假设这个线程池的作用是用来发起网络请求的,也就是同时可以产生20个并发的网络请求,这个时候如果有第21个请求到来,就将排队等候,直到20个并发线程有一个结束,资源回收交给第21个请求。


控制了池子大小,就保证系统资源不会被过度浪费,大家要排队使用。重复利用这个线程,又节省掉了开启一个新线程的时间。


有同学不禁要发问,那岂不是如果真的有100个,这种线程池就影响了系统的效率,因为后80个要始终排队?很显然,线程池的设计是一种平衡的设计,Ta利用可控的线程数量,保证系统的基本可用性,同时节省了创建线程的时间成本,对于如果真的有100个的情况,要评估其平均使用水平和系统所能承受的线程数量,来动态调整,比如对于高峰期可以加大线程池的线程数量,低峰期降低数量来交出更多资源,就像理想中的银行窗口一样(但是银行都TMD是人多了也还是一个窗口...)。


同理可推导,创建对象也是浪费时间的,所以提供了很多个对象放到池子里面,大家循环利用。数据库连接也是宝贵的,所以提供了一些连接资源放到池子里面大家使用。


举个大家都懂的例子,你是一个老板,雇佣了3名员工(池子大小是3),每天的例行任务都交给这三个人承担,如果1名员工今天干的快,那你还可以分配给他新的任务,总之你是不会让你的员工闲着的,你也深知这三个人我都每个月付给他们薪水了,我再有什么事情显然用他们比现找临时工(申请资源成本高)要方便而且成本更低,所以为了节省,你也要不断的剥削这三名员工(复用)。


但是眼看着到旺季了,这三个人真的忙不过来,你不得不再多加一名员工(线程池扩大),忙了大半年,终于淡季了,眼看着活儿也没有那么多了,又快要到发年终奖的时候了,为了节省成本,你不得不产生了开除第四名员工的想法(减少线程池)。


总结一下,池化技术就是充分保障系统效率的前提下,充分复用资源的一种方式,一切皆成本和效率。


PS:各位在后台提的问题,除了表述不清、缺少背景信息,绝大多数问题以前的老文章都有涉猎和讲述,请大家出门左转,自行寻找。

以上是关于线程池对象池连接池都是什么?的主要内容,如果未能解决你的问题,请参考以下文章

线程池

java线程池

线程池构造函数的含义

java 线程池机制的原理是啥?

Java线程池之线程池原理

java创建线程池都有哪些