吓我一跳?看了线程和线程池的对比,才知道池化技术到底有多牛

情商高的人是能洞察并照顾到身边所有人的情绪 , 而好的文章应该是让所有人都能看懂 。
尼采曾经说过:人们无法理解他没有经历过的事情 。 因此我会试着把技术文章写的尽量具象化一些 , 力求让所有人都能看懂 , 所以在正式开始之前 , 我们先从两个生活事例说起 。
吓我一跳?看了线程和线程池的对比,才知道池化技术到底有多牛文章插图
唠嗑:之前一直以为尼采是中国的某位圣人 , 大体和庄子差不多 , 后来才知道原来是一位老外 , 惊了个呆 。
生活案例 1早些年间 , 某宝双“11”突然爆火 , 然后无数个男男女女疯狂“剁手” , 然而最痛苦的并不是“剁手”之后吃“灰”的日子 , 而是漫长而又揪心的等待快递小哥的日子 。
吓我一跳?看了线程和线程池的对比,才知道池化技术到底有多牛文章插图
为了缓解彼此的“痛苦”(快递公司的电话被打爆 , 用户等得不耐烦) , 快递公司后面就变“聪明”了 , 每当购物节将要来临之前 , 快递公司会预先准备好充足的人和车 , 以迎接扑面而来的订单 。
至此 , 当我们再遇到各种购物节 , 就再也不用每天盯着手机煎熬的等待快递小哥了 。
生活案例 2小美是一家公司的 HR , 每年年初是小美最头疼的日子了 。 因为年初有大量的员工离职 , 因此小美需要一边办理离职员工的手续 , 一边疯狂的招人 , 除了这些工作之外 , 小美还要忍受来自各部门和大 BOSS 的间歇性催促 , 这些都让小美痛苦不已 。
于是为了应对每年年初的这种囧境 , 小美也变聪明了 , 她每年年末的时候都会预先招聘一些员工 , 以备来年的不时之需 。
自从用了这招之后(提前招人) , 小美从此过上了幸福的生活 。
吓我一跳?看了线程和线程池的对比,才知道池化技术到底有多牛文章插图
概念池化技术指的是提前准备一些资源 , 在需要时可以重复使用这些预先准备的资源 。
也就是说池化技术有两个优点:

  1. 提前创建;
  2. 重复利用 。
池化技术优点分析以 Java 中的对象创建来说 , 在对象创建时要经历以下步骤:
  1. 根据 new 标识符后面的参数 , 在常量池查找类的符号引用;
  2. 如果没找到符号应用(类并未加载) , 进行类的加载、解析、初始化等;
  3. 虚拟机为对象在堆中分配内存 , 并将分配的内存初始化为 0 , 针对对象头 , 建立相应的描述结构(耗时操作:需要查找堆中的空闲区域 , 修改内存分配状态等);
  4. 调用对象的初始化方法(耗时操作:用户的复杂的逻辑验证等操作 , 如IO、数值计算是否符合规定等) 。
从上述的流程中可以看出 , 创建一个类需要经历复杂且耗时的操作 , 因此我们应该尽量复用已有的类 , 以确保程序的高效运行 , 当然如果能够提前创建这些类就再好不过了 , 而这些功能都可以用池化技术来实现 。
池化技术常见应用常见的池化技术的使用有:线程池、内存池、数据库连接池、HttpClient 连接池等 , 下面分别来看 。
1.线程池线程池的原理很简单 , 类似于操作系统中的缓冲区的概念 。 线程池中会先启动若干数量的线程 , 这些线程都处于睡眠状态 。 当客户端有一个新的请求时 , 就会唤醒线程池中的某一个睡眠的线程 , 让它来处理客户端的这个请求 , 当处理完这个请求之后 , 线程又处于睡眠的状态 。
线程池能很高地提升程序的性能 。 比如有一个省级数据大集中的银行网络中心 , 高峰期每秒的客户端请求并发数超过100 , 如果为每个客户端请求创建一个新的线程的话 , 那耗费的 CPU 时间和内存都是十分惊人的 , 如果采用一个拥有 200 个线程的线程池 , 那将会节约大量的系统资源 , 使得更多的 CPU 时间和内存用来处理实际的商业应用 , 而不是频繁的线程创建和销毁 。
吓我一跳?看了线程和线程池的对比,才知道池化技术到底有多牛文章插图
2.内存池如何更好地管理应用程序内存的使用 , 同时提高内存使用的频率 , 这时值得每一个开发人员深思的问题 。 内存池(Memory Pool)就提供了一个比较可行的解决方案 。
内存池在创建的过程中 , 会预先分配足够大的内存 , 形成一个初步的内存池 。 然后每次用户请求内存的时候 , 就会返回内存池中的一块空闲的内存 , 并将这块内存的标志置为已使用 。 当内存使用完毕释放内存的时候 , 也不是真正地调用 free 或 delete 的过程 , 而是把内存放回内存池的过程 , 且放回的过程要把标志置为空闲 。 最后 , 应用程序结束就会将内存池销毁 , 将内存池中的每一块内存释放 。