码迷,mamicode.com
首页 > 编程语言 > 详细

关于Java线程意外退出自动重启..

时间:2015-09-10 23:57:46      阅读:700      评论:0      收藏:0      [点我收藏+]

标签:

  最近做项目使用到第三方推送功能,然后创建了一个线程用来循环读取队列中的数据,当队列为空时,则线程暂停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共同学习..

关于Java线程意外退出自动重启..

标签:

原文地址:http://www.cnblogs.com/xiao-yang1990/p/4799632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!