java多线程学习2:线程的生命周期监听-Observer模式

1先说说这个Observer模式
常说的观察者模式或listener模式。
常用的就是MQ中的消息接收监听、spring/spring mvc中的容器刷新监听等待。

用一句话来说,注册自己感兴趣的事件源。下面画个uml图

这里写图片描述
简陋一点 但有内涵。

观察者:关注自己的业务,等待事件出发

事件:触发后,主动调用观察者

在工作中.observer模式能解决很多的问题,比如说状态变化的监控、回调通知等等。

贴下代码:

Lisenter 观察者的抽象

package com.puqiuyu.thread.blog;


public interface Listener {

    void  onEvent(RunnableEvent runnableEvent);
}

通知消息

package com.puqiuyu.thread.blog;

public class RunnableEvent {
    private String name;
    private RunnableState state;
    private Throwable e;

    public RunnableEvent(String name,RunnableState state,Throwable e) {
        this.name = name;
        this.state = state;
        this.e = e;
    }
    public String getName() {
        return name;
    }
    public RunnableState getState() {
        return state;
    }
    public Throwable getE() {
        return e;
    }
    public enum RunnableState{
        RUNNING,DEAD,ERROR;
    }
}

具体的观察者

public class ThreadLifeCycleListener implements Listener{
    @Override
    public void onEvent(RunnableEvent runnableEvent) {
        System.out.println("thread : "+ runnableEvent.getName());
        System.out.println("status : " + runnableEvent.getState());
        System.out.println("error : " + runnableEvent.getE());
    }

}

具体的事件

package com.puqiuyu.thread.blog;

import java.util.LinkedList;

import com.puqiuyu.thread.blog.RunnableEvent.RunnableState;

public class ObserverThread extends Thread{

    public ObserverThread(String name) {
        super(name);
    }

    private LinkedList<Listener> listeners = new LinkedList<>();

    public synchronized void addListener(Listener listener) {
        listeners.add(listener);
    }

    private void notifyListener(RunnableEvent runnableEvent){
        for (Listener listener : listeners) {
            listener.onEvent(runnableEvent);
        }
    }

    @Override
    public void run() {
        try {
            notifyListener(new RunnableEvent(Thread.currentThread().getName(),RunnableState.RUNNING, null));
            //dosomthing
            System.out.println(Thread.currentThread().getName() + " do something...");
            Thread.sleep(10_000L);
            notifyListener(new RunnableEvent(Thread.currentThread().getName(),RunnableState.DEAD, null));
        } catch (InterruptedException e) {
            notifyListener(new RunnableEvent(Thread.currentThread().getName(),RunnableState.ERROR, e));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值