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 ...
随机推荐
- win10 uwp 萤火虫效果
原文:win10 uwp 萤火虫效果 本文在Nukepayload2指导下,使用他的思想用C#写出来. 本文告诉大家,如何使用 win2d 做出萤火虫效果. 安装 win2d 安装win2d的方法请使 ...
- DataGridView 中发生以下异常: System.Exception: 是 不是 Decimal 的有效值。 ---> System.FormatException: 输入字符串的格式不正确。
其实之前我自己是没测出这个问题的,但是一放到测试的手上就出来了,原因我知道在哪里改输什么东西,但是人家不知道啊.报错如下: --------------------------- “DataGridV ...
- 零元学Expression Blend 4 Chapter 22 以实作案例学习Frame及HyperlinkButton
原文:零元学Expression Blend 4 Chapter 22 以实作案例学习Frame及HyperlinkButton 本章将教大家如何以实作善用Blend4的内建功能-「Frame」以及「 ...
- asp.net core2.0中网站发布的时候,视图文件不被打包成dll
项目csproj文件里面加 <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <Target ...
- 海康sdk
package com.hikvision.artemis.sdk.util; import java.util.Collections; import java.util.Iterator; imp ...
- easyui tree后台传json处理问题
一.tree json格式 [ { "id": 1, "text": "权限管理", "iconCls": " ...
- 针对TianvCms的搜索优化文章源码(无版权, 随便用)
介绍: 搜索优化虽然不是什么高深的技术, 真正实施起来却很繁琐, 后台集成搜索优化的文章可以便于便于管理, 也让新手更明白优化的步奏以及优化的日常. 特点: 根据自己的经验和查阅各种资料整理而成, 相 ...
- django自带的cache
cache语法 from django.core.cache import cache #存入内存 cache.set("aaa",123) #从内存中获取 cache.get(& ...
- Spring Boot之Actuator的端点
Spring Boot Actuator的关键特性是在应用程序里提供众多Web端点,通过它们了解应用程序 运行时的内部状况.有了Actuator,你可以知道Bean在Spring应用程序上下文里是如何 ...
- Fabric1.4源码解析:Peer节点加入通道
又开始新的阅读了,这次看的是Peer节点加入通道的过程.其实每次看源码都会有好多没有看懂的地方,不过相信只要坚持下去,保持记录,还是有很多收获的. 对于Peer节点加入通道这一 ...