写点什么

druid 源码学习七

作者:Nick
  • 2022 年 5 月 18 日
  • 本文字数:1176 字

    阅读完需:约 4 分钟

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 机制,复习了守护线程,对守护线程的概念、需注意点、使用场景及如何创建守护线程做了介绍。

发布于: 刚刚阅读数: 4
用户头像

Nick

关注

终身学习,向死而生 2020.03.18 加入

得到、极客时间重度学习者,来infoQ 是为了输出倒逼输入

评论

发布
暂无评论
druid源码学习七_Nick_InfoQ写作社区