一文弄懂连接池和线程池
线程池
线程池的原理类似于操作系统中的缓冲区的概念。
先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。
也许有人质疑:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了吗?这也许是个不错的方法,因为它能使你的代码相对容易一些,但是却忽略了性能问题。
假如有一个省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过100,如果为每个客户端请求创建一个新线程的话,那耗费的CPU时间和内存将是惊人的,如果采用一个拥有200个线程的线程池,那将会节约大量的系统资源,使得更多的CPU时间和内存用来处理实际的商业应用,而不是频繁的线程创建与销毁。
连接池
数据库连接是一种关键的有限的昂贵的资源,这一点多用户的网页应用程序中体现的尤为突出。
一个数据库连接池对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库连接对象),由应用程序动态的对池中的连接进行申请,使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。
连接池技术尽可能多的重用了消耗内存的资源,大大节省了内存,提高了服务器的服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来检视数据库连接的数量、使用情况等。
1.最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
2.最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
区别
连接池:
- 连接池是面向数据库连接的;
- 连接池是为了优化数据库连接资源;
- 连接池有点类似在客户端做优化;
线程池:
- 线程池是面向后台程序的;
- 线程池是是为了提高内存和CPU效率;
- 线程池有点类似于在服务端做优化;
总而言之,两者是不同方面的应用,没什么太多的比较空间,池化的技术都是为了性能和效率的提升,这点才最重要!
******************************************************拓展********************************************************************
为什么要使用线程池
线程池实际上就是一种多线程的使用方式,从设计上来讲,是一个生产消费者模型。有同学说,直接在项目中直接new一个thread,不是非常爽吗,一行代码的事儿,为什么还要专门去开一个线程池来管理,真麻烦。其实不然,线程池带来的好处可是很多的。
降低资源消耗
线程池通过重复使用已创建的线程执行任务,而不必每次都创建新的线程,减少系统资源损耗。
线程实现一般有三种方式。一个是内核线程实现,一个是用户线程实现,另外一种就是用户线程+内核线程混合实现。
java采用的是使用内核线程的高级接口——轻量级进程(LIGHT WEIGHT PROCESS,LWP)每个LWP都对应着一个内核线程,为1:1的关系。简单来说,一个java的线程就对应一个内核线程。
这意味着,如果要对线程进行创建、阻塞、销毁,都会进行系统调用。这种代价是很高的,系统需要进行内核态和用户态的切换。同时,LWP需要消耗一定的内核资源(像线程栈空间等资源),所以数量上也受限制。自然也就不能创建过多的线程。
提高响应速度
上面的部分其实已经告诉我们这一点了,因为在重复使用已经创建好的线程时,避免了线程的创建时间,所以可以提高响应速度。
提高线程的可管理性
线程池本身提供了很多的对线程的管理操作。比如对线程数量、任务数量、线程名称、拒绝策略等等,都可以进行管理。而new Thread()本身很难做到这些。
比如new Thread()的线程执行任务速度非常慢,导致多次创建线程,存在非常多正在执行任务的线程,那么系统资源将被消耗殆尽。线程池可以通过上述的管理方法,将此问题kill掉。
比如在应用程序中,两个服务资源消耗占比不一样,那么可以通过线程池进行更合理的资源分配。
作者:桃子大大
链接:https://www.jianshu.com/p/9aa8ff032499
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:java迷途小菜鸡
链接:https://www.jianshu.com/p/a25bc5ff7942
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一文弄懂连接池和线程池相关推荐
- 一文弄懂Java中线程池原理
在工作中,我们经常使用线程池,但是你真的了解线程池的原理吗?同时,线程池工作原理和底层实现原理也是面试经常问的考题,所以,今天我们一起聊聊线程池的原理吧. 为什么要用线程池 使用线程池主要有以下三个原 ...
- 并发、并行、同步、异步、进程,线程、串行、并行?一文弄懂八大概念
并发.并行.同步.异步.进程,线程.串行.并行?一文弄懂八大概念 参考博文:并发.并行.串行.同步.异步的区别? java多线程详解(并发,并行,同步) 文章目录 并发.并行.同步.异步.进程,线程. ...
- 一文弄懂-《Scalable IO In Java》
目录 一. <Scalable IO In Java> 是什么? 二. IO架构的演变历程 1. Classic Service Designs 经典服务模型 2. Event-drive ...
- 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述
<繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...
- 一文弄懂神经网络中的反向传播法
最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...
- 一文弄懂神经网络中的反向传播法——BackPropagation【转】
本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法--BackPropagation 最近在看深度学习的东 ...
- 一文弄懂String的所有小秘密
文章目录 简介 String是不可变的 传值还是传引用 substring() 导致的内存泄露 总结 一文弄懂String的所有小秘密 简介 String是java中非常常用的一个对象类型.可以说ja ...
- CAD2010 为了保护_一文弄懂,锂电池的充电电路,以及它的保护电路方案设计
原标题:一文弄懂,锂电池的充电电路,以及它的保护电路方案设计 锂电池特性 首先,芯片哥问一句简单的问题,为什么很多电池都是锂电池? 锂电池,工程师对它都不会感到陌生.在电子产品项目开发的过程中,尤其是 ...
- deque stack java_一文弄懂java中的Queue家族
简介 java中Collection集合有三大家族List,Set和Queue.当然Map也算是一种集合类,但Map并不继承Collection接口. List,Set在我们的工作中会经常使用,通常用 ...
最新文章
- linux 上oracle安装
- eclipse折叠所有代码快捷键
- 26.进程空间和线程空间
- 什么笔记本电脑好_买个什么价格的笔记本电脑好,如何选购笔记本电脑
- SAP UI5 Web Component不同React页面的跳转实现
- 4004-基于邻接矩阵的新顶点的增加(C++,附思路)
- 与Win8之磁盘活动时间100%斗争心得
- uml类图用什么软件画_为什么需要UML类图建模?
- ajax跨域获取数据后处理,简单实现ajax获取跨域数据
- ALEIS,啊,累死
- 老王学linux-系统安全
- 如何开发一个油猴脚本- 从零开始编写一个油猴脚本
- 基于javaEE的医院病历管理系统的设计与实现
- “瘦”AP和“胖”AP的区别
- java做mmo服务器_MMO聊天服务器设计
- Linux CentOS 7 多网卡配置bond模式 bond1 bond5 bond6
- GanttChart
- IO多路复用底层原理及源码解析
- 如何把公众号的内容同步到头条自媒体号上?
- linux windos 设计理念,Windows 20 概念设计
热门文章
- 学而时习之(1):单边sar adc测热电偶温度
- ESP32 开发笔记(三)源码示例 7_WS2812_RMT 使用ESP32的RMT实现彩虹变色效果
- python标准库wave的使用说明
- ZooKeeper Dynamic Reconfiguration(ZooKeeper 动态配置重构)
- Python之psutil库的使用
- mySQL基本语法 DDL语句
- 技术小咖之windows图形界面基础
- postman上传文件(multipart/form-data请求)
- linux查找文件夹命令_如何在Linux中使用命令行查找文件和文件夹
- python消息队列中间件_常见的消息队列中间件介绍