一、无法掌控 Thread 的生命周期
在 Java 中线程的实现只有一个,就是 Thread 。
下面是启动一个线程的通用代码,如下:![[线程设计]-通过观察者模式-监控线程生命周期 - 图1](/uploads/projects/it-learn@java-base/c67113ed27920ad34a9a5ae86ed0c103.webp)
通过 new Thread ,通过调用其 start() 方法即可开启一个线程。
但是该方式有个问题,线程执行到了哪一个环节,无法得知。
二、观察者-监控线程生命周期
观察者模式的定义如下:
在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象会自动收到通知。
观察者模式通常有两种对象角色:观察者 和 被观察者
简单来理解观察者模式:被观察者 持有 观察者 的对象实例,当被观察者 执行了某项操作后,会分别调用持有的观察者** 的处理方法,从而达到观察者观察,被观察者通知的效果。
在线程生命周期监控中,观察者就是进行生命周期处理的对象。被观察者就是线程。
线程(被观察者)持有生命周期处理的对象(观察者),当线程执行到某个阶段,调用生命周期处理对象中的对应方法(被观察者),从而达到观察者监控线程生命周期的目的。
三、具体实现
3.1、观察者:生命周期处理
![[线程设计]-通过观察者模式-监控线程生命周期 - 图2](/uploads/projects/it-learn@java-base/45e9aa0b17861b1ffaeab664ba310daa.webp)
代码类图实现如上,接口定义了在不同线程生命周期的处理逻辑。
相关具体实现可以自行实现
3.2、被观察者:线程
被观察者需要持有观察者对象,才能够完成通知的操作
![[线程设计]-通过观察者模式-监控线程生命周期 - 图3](/uploads/projects/it-learn@java-base/3a91b063def8de21ee7d91ea550b4635.webp)
代码实现类图如上,上述类图中主要是三个类:
- Thread :Java 中线程的唯一实现
- Observable:被观察者接口规范(屏蔽 Thread 的API,仅暴露需要的API)
- ObservableThread:被观察者,继承了 Thread ,拥有线程功能,同时自定接口
Observable规范相关操作。
在被观察者(线程实现:ObservableThread) 中,主要的代码逻辑两块:
- 持有观察者(TaskLifecycleObserve )实例对象
- 线程执行逻辑(run 方法)
上述两块代码组成了线程监控的主要内容,关键代码如下:
![[线程设计]-通过观察者模式-监控线程生命周期 - 图4](/uploads/projects/it-learn@java-base/f2d5e8cedeb1e623e3b9d46840bf46d3.webp)
如上述代码所示,在执行线程逻辑 run() 方法时,在特定线程位置,埋点,根据不同的线程生命周期,调用观察者的特定方法,起到监控线程生命周期的效果。
3.2、整体实现类图
![[线程设计]-通过观察者模式-监控线程生命周期 - 图5](/uploads/projects/it-learn@java-base/0d18a4112dffb3601222c6b416ced292.webp)
