zoukankan      html  css  js  c++  java
  • 关于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共同学习..

  • 相关阅读:
    linux下文件结束符
    【转】跟我学Kafka之NIO通信机制
    【转】 详解Kafka生产者Producer配置
    【转】项目延期的⑦大因素
    (转)EOSIO开发(三)钱包、账户与账户权限之概念篇
    CentOS里alias命令
    (转)EOSIO开发(一)使用Docker构建本地环境
    Marathon自动扩缩容(marathon-lb-autoscale)
    (转)Springboot日志配置(超详细,推荐)
    Spring Boot下的lombok安装以及使用简介
  • 原文地址:https://www.cnblogs.com/xiao-yang1990/p/4799632.html
Copyright © 2011-2022 走看看