關於Java線程意外退出自動重啟..


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM