最近做项目使用到第三方推送功能,然后创建了一个线程用来循环读取队列中的数据,当队列为空时,则线程暂停2秒.一切都像想象中的辣么美好.可是在后面的测试中发现收不到推送的消息了,接着发现了原来推送的线程由于抛出异常直接挂了,然后百度了一下解决方案,感谢前辈们为我们指明了方向.发现了使用Java中的观察者模式可以很好的解决这个问题,下面是我写的测试代码...
首先是一个线程类继承Observable实现Runnable,注意catch中的代码:
packagecom.lifesense;importjava.util.Observable;importjava.util.concurrent.BrokenBarrierException;public class PushServie extends Observable implementsRunnable {//此方法一经调用,立马可以通知观察者,在本例中是监听线程
public voiddoBusiness() {if (true) {super.setChanged();
}
notifyObservers();
}
@Overridepublic voidrun() {while (true) {
System.out.println("线程运行了");try{
Thread.sleep(1000);if (1 == 1) {throw new RuntimeException("线程挂了");
}
}catch(Exception e) {
e.printStackTrace();
doBusiness();break;
}
}
}public static voidmain(String[] args) {
PushServie ps= newPushServie();
Listener listener= newListener();
ps.addObserver(listener);newThread(ps).start();
}
}
后面是一个监听这个线程的类,只要实现Observer接口就行了:
packagecom.lifesense;importjava.util.Observable;importjava.util.Observer;public class Listener implementsObserver {
@Overridepublic voidupdate(Observable o, Object arg) {
System.out.println("RunThread死机");
PushServie run= newPushServie();
run.addObserver(this);newThread(run).start();
System.out.println("RunThread重启");
}
}
运行一下main方法结果:
本人属于菜鸟一枚,如果你发现有什么不妥的欢迎批评指正,我的QQ:821196632,欢迎大家加我qq共同学习..
原文:http://www.cnblogs.com/xiao-yang1990/p/4799632.html