Java监控任务的生命周期
Observable:
public interface Observable {
enum Cycle{
STARTED, RUNNING, DONE, ERROR
}
Cycle getCycle();
void start();
void interrupt();
}
TaskLifeCycle:
public interface TaskLifeCycle<T> {
void onStart(Thread thread);
void onRunning(Thread thread);
void onFinish(Thread thread,T result);
void onError(Thread thread,Exception e);
}
class EmptyLifeCycle<T> implements TaskLifeCycle<T>{
@Override
public void onStart(Thread thread) {
}
@Override
public void onRunning(Thread thread) {
}
@Override
public void onFinish(Thread thread, T result) {
}
@Override
public void onError(Thread thread, Exception e) {
}
}
Task:
public interface Task <T>{
T call();
}
ObservableThread:
/*
突然发现Observable中的start方法有点可怕的啊,这种写法,我感觉我是还每吃透
*/
public class ObservableThread<T> extends Thread
implements Observable{
private final TaskLifeCycle<T> lifeCycle;
private final Task<T> task;
private Cycle cycle;
public ObservableThread(Task<T> task){
this(new TaskLifeCycle.EmptyLifeCycle<>(),task);
}
public ObservableThread(TaskLifeCycle<T> lifeCycle,Task<T> task){
super();
if(task==null)
throw new IllegalArgumentException("The task is required.");
this.lifeCycle=lifeCycle;
this.task=task;
}
public final void run(){
this.update(Cycle.STARTED,null,null);
try{
this.update(Cycle.RUNNING,null,null);
T result = this.task.call();
this.update(Cycle.DONE,result,null);
} catch (Exception e){
this.update(Cycle.ERROR,null,e);
}
}
private void update(Cycle cycle, T result, Exception e){
this.cycle = cycle;
if (lifeCycle == null) {
return;
}
try {
switch (cycle) {
case STARTED:
this.lifeCycle.onStart(currentThread());
break;
case RUNNING:
this.lifeCycle.onRunning(currentThread());
break;
case DONE:
this.lifeCycle.onFinish(currentThread(), result);
break;
case ERROR:
this.lifeCycle.onError(currentThread(), e);
break;
}
} catch (Exception ex) {
throw ex;
}
}
public Cycle getCycle(){
return this.cycle;
}
}
测试代码:
/*
突然发现Observable中的start方法有点可怕的啊,这种写法,我感觉我是还每吃透
*/
public class ObservableThread<T> extends Thread
implements Observable{
private final TaskLifeCycle<T> lifeCycle;
private final Task<T> task;
private Cycle cycle;
public ObservableThread(Task<T> task){
this(new TaskLifeCycle.EmptyLifeCycle<>(),task);
}
public ObservableThread(TaskLifeCycle<T> lifeCycle,Task<T> task){
super();
if(task==null)
throw new IllegalArgumentException("The task is required.");
this.lifeCycle=lifeCycle;
this.task=task;
}
public final void run(){
this.update(Cycle.STARTED,null,null);
try{
this.update(Cycle.RUNNING,null,null);
T result = this.task.call();
this.update(Cycle.DONE,result,null);
} catch (Exception e){
this.update(Cycle.ERROR,null,e);
}
}
private void update(Cycle cycle, T result, Exception e){
this.cycle = cycle;
if (lifeCycle == null) {
return;
}
try {
switch (cycle) {
case STARTED:
this.lifeCycle.onStart(currentThread());
break;
case RUNNING:
this.lifeCycle.onRunning(currentThread());
break;
case DONE:
this.lifeCycle.onFinish(currentThread(), result);
break;
case ERROR:
this.lifeCycle.onError(currentThread(), e);
break;
}
} catch (Exception ex) {
throw ex;
}
}
public Cycle getCycle(){
return this.cycle;
}
}
《Java高并发编程详解》笔记
Java监控任务的生命周期的更多相关文章
- [转]JAVA虚拟机的生命周期
JAVA虚拟机体系结构 JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例 ...
- java 静态变量生命周期(类生命周期)
Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 销毁:类被卸载时,静态变量被销毁,并释放 ...
- Java类的生命周期详解
引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告 ...
- 【转】Java 类的生命周期详解
一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大 ...
- 【转载】详解java类的生命周期
原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑, ...
- Java线程的生命周期(转)
Java线程的生命周期 一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,使线程进入Running状态,真正 ...
- Java 对象的生命周期
Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1. 创建阶段(Created) 2. 应用阶段(In Use) 3. 不可见阶段(Invisib ...
- Java虚拟机(三)垃圾标记算法与Java对象的生命周期
前言 这一节我们来简单的介绍垃圾收集器,并学习垃圾标记的算法:引用计数算法和根搜索算法,为了更好的理解根搜索算法,会在文章的最后介绍Java对象在虚拟机中的生命周期. 1.垃圾收集器概述 垃圾收集器( ...
- [Java]类的生命周期(上)类的加载和连接[转]
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java ...
随机推荐
- 分配粒度和内存页面大小(x86处理器平台的分配粒度是64K,内存页是4K,所以section都是0x1000对齐,硬盘扇区大小是512字节,所以PE文件默认文件对齐是0x200)
分配粒度和内存页面大小 x86处理器平台的分配粒度是64K,32位CPU的内存页面大小是4K,64位是8K,保留内存地址空间总是要和分配粒度对齐.一个分配粒度里包含16个内存页面. 这是个概念,具体不 ...
- Android零基础入门第66节:RecyclerView点击事件处理
前面两期学习了RecyclerView的简单使用,并为其item添加了分割线.在实际运用中,无论是List还是Grid效果,基本都会伴随着一些点击操作,那么本期就来一起学习RecyclerView的点 ...
- GzipStream的简单使用压缩和解压
压缩和解压都需要用到三个流实例,分别是文件读取流.文件写入流.压缩流. 读取流和写入流有多种形式,压缩流就一种GzipStream. 不同的是对于压缩,是需要用文件写入流作为创建压缩流实例的参数, 压 ...
- 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...
- Qt第三方圆形进度条-及其改进
Qt第三方圆形进度条的改进 要实现一个圆形的进度条功能,在网上找到一个比较出名的第三方封装类:QRoundProgressBar,地址:sourceforge 的 QRoundProgressBar ...
- Java 函数传入参数后,究竟发生了什么?java函数传参数原理解析
JAVA函数在传入参数A时,会在函数作用周期内生成一个与参数相同类型的局部变量B. B与A指向同一块内存区域,并且具有相同的名字如param. 在函数内所有对param的操作都是对B的操作.对B进行赋 ...
- 函数式编程里的Materialization应该翻译成什么?
Materialization是函数式编程里的一个专业术语, 用于特指函数式编程中查询被实际执行并生成结果的这一过程. 首先, 搜了一下中文资料, 暂时没有对该词的中文翻译, CSDN\博客园\阿里 ...
- 3022Java_运算
运算 1.运算符分类 算术运算符 二元运算符 +,-,*,/,% 一元运算符 ++,-- 赋值运算符 = 扩展运算符 +=,-=,*=,/= 关系运算符 >,<,>=,<= ...
- mvc中Scripts.Render的用法
第一次接触新的东西,都会很陌生,但是时间久了就熟悉了变简单了. 视图文件中使用Scripts.Render()输出脚本包,Styles.Render()输出样式包 上面两张图是我所做项目里的,放上面会 ...
- Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统
Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统 标签(空格分隔): Qemu ARM Linux 经过上一篇<Qemu搭建ARM vexpress开发环境(二)- ...