推荐书籍:《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

线程的生命周期_[线程设计]通过观察者模式监控线程生命周期相关推荐

  1. java虚拟机的生命周期_深入理解Java虚拟机——JVM的生命周期

    package test; public class JVMTestLife { public static void main(String[] args) { new Thread(new Run ...

  2. java线程 cpu占用率_多线程程序 怎样查看每个线程的cpu占用

    可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的 ...

  3. python线程安全的计数器_+ =运算符在Python中是线程安全的吗?

    + =运算符在Python中是线程安全的吗? 我想为实验创建一个非线程安全的代码块,这些是2个线程将要调用的函数. c = 0 def increment(): c += 1 def decremen ...

  4. winform判断线程有没有完成_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...

    △ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...

  5. java线程池饱和策略_干货:Java几种线程池的分析和使用。

    原标题:干货:Java几种线程池的分析和使用. 利用线程池的优势: 1.降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 2.提高响应速度.当任务到达时,任务可以不需要等到线程创建 ...

  6. python获取信号频率和周期_从FFT中求出信号的周期

    我有一个周期信号,我想找出周期. 由于存在边界效应,我首先去掉边界,通过观察第一个和最后一个极小值保持N个周期.在 然后,计算FFT.在 代码:import numpy as np from matp ...

  7. python线程与进程视频教程_[PYTHON系列教程]→进程 vs. 线程

    我们介绍了多进程和多线程,这是实现多任务最常用的两种方式.现在,我们来讨论一下这两种方式的优缺点.首先,要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Work ...

  8. sdlc 瀑布式 生命周期_管理信息系统中的系统开发生命周期(SDLC)

    sdlc 瀑布式 生命周期 系统开发生命周期(SDLC) (Systems Development Life Cycle (SDLC)) SDLC stands for "Systems D ...

  9. 请写一个java程序实现线程连接池功能_写一个java程序实现线程连接池的功能

    线程池: import java.util.linkedlist; public abstract class manager { private string mthreadpoolname = n ...

最新文章

  1. ML之DT:机器学习根据大量数据,已知年龄、收入、是否上海人、私家车价格的一个人,预测是否有真实购买上海黄浦区楼房的能力
  2. a标签,选中当前菜单后高亮
  3. ROS-Kinetic 中使用XSENS MTI 1 姿态传感器
  4. gradle 查看依赖类库版本_如何查找第三方库(Gradle引用)的依赖?
  5. cocos2d 嵌入网页_在 cocos2d-x 中嵌入浏览器
  6. mysql 1698 错误
  7. 喇叭POP爆破音产生的原因与解决办法
  8. 全文搜索引擎solr使用说明
  9. html脚注制作,幸福西饼:静态页面制作项目总结
  10. [架构之美]一款APP从想法-开发-上线-产品的全过程
  11. word段落每行首字怎么对齐_怎样使word文章段落乖乖对齐!一个设置就行!
  12. JavaScript课堂笔记
  13. 小标题 html,论文的小标题格式
  14. 想要刚毕业就月入过万必须要懂这些面试题(Vue 篇)
  15. 编程逻辑性思维的重要性
  16. 对比SQL学习power bi--(2)表关联顺序!
  17. 一个QQ空间的钓鱼盗号过程揭露,大家谨防上当
  18. 查看Window系统激活信息
  19. 电子商务学计算机为什么,千万不要学电子商务(大专学的计算机专业就业难吗)...
  20. autorelease 释放池

热门文章

  1. 面试官:说说 Java 中的 Unsafe 和 CAS
  2. 大厂的 404 页面都长啥样?最后一个绝了...
  3. Disruptor之概览
  4. java 升级1.8_升级系统中的java到1.8版本详解
  5. linux内核环境变量,Linux上安装配置JDK环境变量
  6. TensorBoard logging requires TensorBoard version 1.15 or above
  7. jcenter下载慢
  8. frame 2 opencv mat
  9. YOLOV3+window10+cuda8.0+cudnn6.0安装过程
  10. 64位oracle客户端_开发小记-golang连接Oracle数据库配置