一、无法掌控 Thread 的生命周期

在 Java 中线程的实现只有一个,就是 Thread
下面是启动一个线程的通用代码,如下:
[线程设计]-通过观察者模式-监控线程生命周期 - 图1
通过 new Thread ,通过调用其 start() 方法即可开启一个线程。
但是该方式有个问题,线程执行到了哪一个环节,无法得知。

二、观察者-监控线程生命周期

观察者设计模式

观察者模式的定义如下:
在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象会自动收到通知。

观察者模式通常有两种对象角色:观察者被观察者

简单来理解观察者模式:被观察者 持有 观察者 的对象实例,当
被观察者 执行了某项操作后,会分别调用持有的观察者** 的处理方法,从而达到观察者观察,被观察者通知的效果。

在线程生命周期监控中,观察者就是进行生命周期处理的对象。被观察者就是线程。

线程(被观察者)持有生命周期处理的对象(观察者),当线程执行到某个阶段,调用生命周期处理对象中的对应方法(被观察者),从而达到观察者监控线程生命周期的目的。

三、具体实现

3.1、观察者:生命周期处理

[线程设计]-通过观察者模式-监控线程生命周期 - 图2
代码类图实现如上,接口定义了在不同线程生命周期的处理逻辑。

相关具体实现可以自行实现

3.2、被观察者:线程

被观察者需要持有观察者对象,才能够完成通知的操作

[线程设计]-通过观察者模式-监控线程生命周期 - 图3
代码实现类图如上,上述类图中主要是三个类:

  • Thread :Java 中线程的唯一实现
  • Observable:被观察者接口规范(屏蔽 Thread 的API,仅暴露需要的API)
  • ObservableThread:被观察者,继承了 Thread ,拥有线程功能,同时自定接口 Observable 规范相关操作。

在被观察者(线程实现:ObservableThread) 中,主要的代码逻辑两块:

  • 持有观察者(TaskLifecycleObserve )实例对象
  • 线程执行逻辑(run 方法)

上述两块代码组成了线程监控的主要内容,关键代码如下:

[线程设计]-通过观察者模式-监控线程生命周期 - 图4

如上述代码所示,在执行线程逻辑 run() 方法时,在特定线程位置,埋点,根据不同的线程生命周期,调用观察者的特定方法,起到监控线程生命周期的效果。

3.2、整体实现类图

[线程设计]-通过观察者模式-监控线程生命周期 - 图5