druid 源码学习七
一、引言
今天拜读了王巍巍老师 druid 完整逻辑流程,回顾了初始化连接池的流程,学习创建连接守护线程等。对 druid 源码有了更加清晰的认识。
二、SPI 机制
在阅读 Init()初始化连接池的实现逻辑时,注意到 SPI 机制,因此想深入了解下。
2.1 SPI 简介
SPI 的全名为 Service Provider Interface,是 Java 提供的可用于第三方实现和扩展的机制,通过该机制,我们可以实现解耦,SPI 接口方负责定义和提供默认实现,SPI 调用方可以按需扩展.当服务的提供者,提供了服务接口的一种实现之后,在 jar 包的 META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该 jar 包 META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。
2.2 SPI 使用场景
当我们提供一套 API 接口服务时,其他人如果想使用只需要引入包便可使用这些接口 API,但是会存在使用该服务的实体有不相同的业务需求,需要进一步的扩展,但是由于 api 是写好的,想要扩展则可以使用 Java 提供的 SPI 机制。因此,若有需要扩展或定制化替换 API 接口提供的默认实现的场景可以使用 SPI 机制。
关于 SPI 机制想进一步学习可以参考:
https://www.jianshu.com/p/7601ba434ff4
三、守护线程
3.1 守护线程的基本概念
jdk api 对 setDaemon(true)方法的解释
将此线程标记为 daemon 线程或用户线程。 当运行的唯一线程都是守护进程线程时,Java 虚拟机将退出。 线程启动前必须调用此方法。
在 Java 的线程中,线程可以分为两类,一是用户线程,也被称为非守护线程。另外一种是守护线程。
守护线程一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束.
3.2 守护线程需要注意的点
守护线程的优先级比较低
守护线程要注意考虑关机动作
守护线程应该永远不去访问固有资源,比如说文件或者数据库,因为它会在任何时候甚至一个操作的中间发生中断。不要给守护线程分担读写逻辑或者计算逻辑,因为无法确定守护线程是否已经完成了工作,但是只要 User 退出守护线程也会立马结束,对于计算机程序来说这样的程序可能多次运行结果不一样,很显然这对于程序来说是毁灭性的。
3.3 守护线程的使用场景
常见的做法,就是将守护线程用于后台支持任务,比如垃圾回收、释放未使用对象的内存、从缓存中删除不需要的条目。按照这个解释,那么大多数 JVM 线程都是守护线程。
3.4 如何创建守护线程
守护线程也是一个线程,因此它的创建和启动其实和普通线程没什么区别。要将普通线程设置为守护线程,方法很简单,只需要调用 Thread.setDaemon() 方法即可。如下代码:
MyThread daemonThread = new MyThread();
daemonThread.setDaemon(true);
daemonThread.start();
四、总结
本篇通过阅读王巍巍老师 druid 完整逻辑流程图展开学习了 SPI 机制,复习了守护线程,对守护线程的概念、需注意点、使用场景及如何创建守护线程做了介绍。
版权声明: 本文为 InfoQ 作者【Nick】的原创文章。
原文链接:【http://xie.infoq.cn/article/39450a43306397d9c110765bf】。文章转载请联系作者。
评论