zoukankan      html  css  js  c++  java
  • 实现可重启线程

    一个需求:要实现能重启的线程。

    背景:要启动一个线程,通过zmq,不断接收放过来的消息,在通知相应的用户。

    假如这个时候网络不好或者其他问题,崩溃了,怎么办。当然,第一时间想到了try catch。

    但是try catch没用啊。虽然没影响到项目的运行,但是这个线程报了异常之后就不会再执行了,这个订阅和通知功能就没有了。

    所以要实现一个,崩溃了可以重新启动的线程了。

    解决:用到了java自带的观察者模式。

    被观察者抛出异常的时候,通知观察者。然后观察者直接给它重启就好了。也不存在观察者猝死的情况。

    被观察者 Observable

    public class RunThread extends Observableimplements Runnable{
    
        // 此方法一经调用,立马可以通知观察者,在本例中是监听线程
    
        publicvoid doBusiness(){
    
            if(true){
    
                super.setChanged();
    
            }
    
            notifyObservers();
    
        }
    
        @Override
    
        publicvoid run() {
    
            intc = 0;
    
            while(true){    //模拟线程运行一段时间之后退出
    
                System.out.println("Runing- "+c+" "+DateUtil.getStdDateTime());
    
                try{
    
                    Thread.sleep(2000);
    
                }catch (InterruptedException e) {
    
                    e.printStackTrace();
    
                    doBusiness();
    
                    break;
    
                }
    
                c++;
    
                //模拟抛出异常
    
                try{
    
                    if(c== 4){
    
                        Stringstr = null;
    
                        str.length();//此处将会抛出空指针异常
    
                    }
    
                }catch (Exception e) {
    
                    e.printStackTrace();
    
                    doBusiness();//在抛出异常时调用,通知观察者,让其重启线程
    
                    break;//异常抛出之后,一定要跳出循环,保证将线程送进地狱
    
                }
    
            }   
    
        }
    
        publicstatic void main(String[] args) {
    
            RunThreadrun = new RunThread();
    
            Listener listen = new Listener();
    
            un.addObserver(listen);
    
            newThread(run).start();
    
            //run.doBusiness();
    
        }
    
    }
    

    观察者 Observer

    public class Listener implements Observer{
    
        @Override
    
        publicvoid update(Observable o, Object arg) {
    
            System.out.println("RunThread死机");
    
            RunThreadrun = new RunThread();
    
            run.addObserver(this);
    
            newThread(run).start();
    
            System.out.println("RunThread重启");
    
        }
    
    }
    

      

  • 相关阅读:
    运筹学 CheatSheet
    东南大学 2021 年夏季赛部分题解
    信号与系统期末复习精要
    信号量的基本同步模式
    OpenMP入门:求pi
    肉眼可见的 Z 变换性质
    操作系统概念 第7章 死锁
    操作系统概念 第10章 文件系统接口
    操作系统概念 第9章 虚拟内存
    操作系统概念 第8章 内存管理
  • 原文地址:https://www.cnblogs.com/wzben/p/7081266.html
Copyright © 2011-2022 走看看