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 ...
随机推荐
- dotnetspider
http://www.cnblogs.com/modestmt/p/5525467.html nuget :DotnetSpider2.Core
- 关于EF ORM 框架的使用问题
1.无法更新 EntitySet“System_UserInfo20140218001”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping& ...
- C#WebBroswer控件的使用
在WebBroswer中可以嵌入一个网页文件,通过Url属性绑定. URI,统一资源标识符,用来唯一的标识一个资源. URL,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源. 它包 ...
- 至于Nim和Crystal这类语言最大的用途,就是活在脑残粉的理想里(发人警醒)
lisp,haskell 有很多人在用,而且是编程经验在 10 年以上,包括 Rust 的作者.Nim 的作者.因此,你不知道有人用,那是因为你的开发阅历太低. 人工智能这个领域从来没有脱离 lisp ...
- 浅谈网络I/O多路复用模型 select & poll & epoll
http://blog.csdn.net/nk_test/article/details/50662946
- WPF与WinForm的抉择
微软曾经对WPF(代号Avalon)抱很大的期望——新一代的华丽用户界面平台,一统Web应用和桌面应用,Flash杀手,尽管微软口头上不承认.几年下来,WPF确实实现了当初的预期的大部分功能,但离称霸 ...
- Ansible的安装与使用初探
一.环境准备 网络配置 管理端:192.168.237.201 受控端:192.168.237.202.192.168.237.203(一共2台) 硬件信息 CPU:1核 内存:512MB 磁盘:10 ...
- 一个基于jQuery写的弹窗效果(附源码)
最近项目中频繁遇到需要弹出窗口的功能,一直使用浏览器默认的Alert和Confirm弹窗,感觉视觉效果不是那么好,而从网上下载的话又找不到合适的,找到的话有些也是十分臃肿,有时候感觉学习配置的功夫自己 ...
- 下载Cloudera Repo
wget http://archive-primary.cloudera.com/gplextras5/redhat/6/x86_64/gplextras/cloudera-gplextras5.re ...
- ansible(三)
一.setup模块(收集信息 ) 1.ansible中的setup模块可以收集到的信息 ansible web -m setup ansible_all_ipv4_addresses # ipv4的所 ...