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