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