最近做項目使用到第三方推送功能,然后創建了一個線程用來循環讀取隊列中的數據,當隊列為空時,則線程暫停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共同學習..