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高并发编程详解》笔记

转载于:https://www.cnblogs.com/junjie2019/p/10604075.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值