学习啦 > 学习电脑 > 电脑故障 > 电脑故障现象 > 自动重启 >

意外退出线程后自动重启的实现方法

时间: 加城1195 分享

  自动重启故障相信大家都遇到过,原因也有很多,跟系统,硬件或者外界因素都有关。下面小编就为大家带来一篇Java线程监听,意外退出线程后自动重启的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  Java线程监听,意外退出线程后自动重启

  前一天写了一个微博爬行程序,主要工作原理就是每隔2分钟爬行一次微博,获取某N个关注朋友微博数量,然后将其保存起来,2分钟之后再次爬行,再取 其微博数量,与2分钟前保存的微博数量比较,如果数量增加,说明该好友在此2分钟之内发布微博,如果数量减少,则是删除微博。最后将爬行结果发送到指定手机上,作为通知!

  今天看微博时发现自己关注的朋友发布了微博,然而自己手机却没有收到报警消息,查看爬行日志发现,在凌晨6点钟时,公司网络曾经断网,导致网络堵 塞,程序在爬行的时候抛出网络异常UnknownHostException,此时线程就已经死掉,猝死。为解决此问题,现有如下需求:线程死掉之后会自动重启。

  常规解决办法有2种:

  1,开启另外一个线程,监听爬行线程,使用线程之间的通信,一般是消费者模式,如果爬行线程死掉之后,监听线程会收到通知,但是如果监听线程先死掉,那么系统也就挂了!

  2,使用心跳机制,爬行线程每隔一段时间往另一服务器进程发送数据包,如果服务器进程长时间没有收到心跳包,则说明爬行线程已经死机!

  两种方法都有合适的使用范围,但是对于监听线程猝死这种情况,个人觉得是使用观察者模式比较合适!现说明一下观察者模式。

  观察者模式:定义对象之间的一种一对多的依赖关系,当对象的状态发生改变时,所有依赖于它的对象都得到通知并且被自动更新。

  观察者模式在JDK中有现成的实现,java.util.Obserable,如何进行监听线程,请看例子:

  被监听的线程类:

  package cn.std.test;

  import java.util.Observable;

  import cn.std.util.DateUtil;

  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();

  }

  }

  被监听的线程需要继承Observable类,继承之后轻松变身为被观察者doBusiness方法,此处可以加上你的业务处理内容,接下来是Listener

  package cn.std.test;

  import java.util.Observable;

  import java.util.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重启");

  }

  }

  很简单,只要实现Observer接口,实现其update方法,在方法内部重启线程

  补充:电脑总是自动重启怎么办

  1、右击“我的电脑”,选择“属性”项。

  2、在打开的系统属性窗口中选择“高级系统设置”项进入。

  3、在打开的“系统属性”窗口中,切换至“高级”选择卡,然后点击“系统和故障恢复 设置”按钮。

  4、在打开的窗口中取消勾选“自动重启启动”项并按确认即可。

  5、当电脑在使用的过程中产生蓝屏时,我们就可以进入“系统日志”管理器中查看产生系统失败的根源啦。打开“运行”对话框,输入命令“eventvwr.msc”即可查看日志信息,从中定位系统产生失败的原因。

  6、当然,我们也可以通过禁用某些开机项来尝试修复系统。打开“运行”对话框,输入命令“msconfig”进入“系统配置实用程序”界面,勾选“常规”选项卡下的“诊断启动”选项。

  7、还有一种修复计算机蓝屏或重启故障的方法,就是在电脑启动时按“F8”进入系统故障菜单,从中选择“安全模式”进入或“最后一次正确的配置”项进入系统,将及有可能修复系统。

  8、当然,如果以上方法均不能解决问题,那么建议您还是重新安装一下系统,毕竟安装系统所耗费的时间相对修复所用时间要少许多。一劳永逸之事才是王道。

  相关阅读:电脑自动重启方法

  方法一:

  1、打开控制面板-管理工具-计划任务程序

  2、创建基本任务,名称栏目,输入“定时重启”,下一步;

  3、在窗口里,有每天、每周、每月、一次各种选择,这里小诚选择一次,这次执行完就失效,您可以根据自己的情况进行选择哈,点击下一步;

  4、设置重启的日期、时间点,下一步;

  5、选择启动程序,下一步;

  6、在打开页面里,点击浏览,找到C;\Windows\System32\Shutdown.exe,点击打开;

  7、在添加参数栏目里输入“-r”(重启),进行下一步

  8、点击完成,即可实现自动重启了

  方法二:

  网上搜索个自动重启关机类软件,这比较多,简单设置一下就可以了。


自动重启的实现方法相关文章:

1.电脑怎么设置自动重启

2.怎么样让电脑实现自动重启关机

3.电脑断电之后自动重启设置怎么设置

4.tp-link怎么设置自动重启

5.电脑怎么设置来电就自动重启

4023013