作为一名Java开发人员,池化技术或多或少在业务代码中使用。常见的包括线程池、连接池等。也是因为Java语言超级丰富的基建,基本上这些池化能力都有着相对成熟的“工具”。
比如,需要使用线程池的时候常常会选择Spring提供的 ThreadPoolTaskExecutor
,工具内部替我们维护了线程的生命周期与任务的状态变化。
线程池的运转流程图
正文开始
在笔者的业务场景里,java服务需要通过命令行启动一个特殊进程,并在进程使用完后将其销毁。而业务对启动这个进程的整体耗时较为敏感,打算利用池化技术,将进程池化复用,去除启动进程的消耗,达到优化性能的目标。
认识 GenericObjectPool
池化技术的概念大家可能都比较熟悉了,但真正要从零开始实现池化能力,就会感觉困难很多。好在Java丰富的基建在提供ThreadPoolTaskExecutor的同时,也提供了GenericObjectPool这个辅助我们实现自定义对象池化的工具。
顺带提一句,JedisPool就是使用这个工具实现的。
GenericObjectPool构造方法一共就3个参数,只有PooledObjectFactory必传;
PooledObjectFactory
按照方法注释的描述,它是专门负责给池子创建对象实例的。当然除了创建对象(makeObject),还包括了检验、激活、销毁对象。基本涵盖了对象生命周期中的各个阶段。
更加详细的说明可以浏览 GenericObjectPool's apidocs
。源码的注释也很详细值得一看。
使用 GenericObjectPool
先引入依赖
根据自身业务实现PooledObjectFactory
接口;作者的业务场景是进程池化,那么对应的创建对象、销毁对象的方法就是创建进程和销毁进程的代码。
下一步就是构建 GenericObjectPool
实例
使用GenericObjectPool
进阶使用 GenericObjectPoolConfig
顾名思义,GenericObjectPoolConfig
是池化工具的配置类;它包含了池的最大容量、池的最大空闲数、最小空闲数等核心参数。除此之外在它的父类 BaseObjectPoolConfig
中,空闲对象检测规则,对象存放队列进出规则(LIFO)等更加细节的配置。
通过调整这些参数值,就能创建符合业务要求的池子。下面就是能常驻4个进程的一套配置参数。
后续
当然真实的业务中还会有很多不相关的逻辑夹杂其中,上文基本涵盖了池化对象搭建与配置的实现方法。最终也实现了性能优化的目标。希望此文能为大家在池化运用多些帮助。
最后说一句(求关注!别白嫖!)
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。
关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!