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));
}
}
}