Java实现双保险线程的示例代码

  

双保险线程,每次启动2个相同的线程,互相检测,避免线程死锁造成影响。
  

  

两个线程都运行,但只有一个线程执行业务,但都会检测对方的时间戳如果时间戳超过休眠时间3倍没有更新的话,则重新启动对方线程。
  

  

例子:
  

  

一般工作线程由自己实现,继承DoubleInsuredThead,在run2()方法里实现具体需求,和一般线程的运行()方法不同,run2()里不用处理循环和休眠检测线程已经由CheckThread实现,可以直接使用,如:启动用户检测线程。
  

        公共静态孔隙startMonitor () {   System.out.println(“启动用户会话检测线程”);   UserMonitor工人=new UserMonitor (“WT-UserMonitor”);   CheckThread检查=new CheckThread (“WT-UserMonitorCheck”, userMonitorIntevalTime);   DoubleInsuredThead。startDoubleInsuredThead(工人、检验员);   }   之前      

完整代码:

        包com.yx.demo.thread;/* *   * DoubleInsuredThead   *双保险线程,每次启动2个相同的线程,互相检测,避免线程死锁造成影响。   * & lt; p>   *两个线程都运行,但只有一个线程执行业务,但都会检测对方的时间戳如果时间戳超过休眠时间3倍没有更新的话,则重新启动对方线程   * & lt; p>   *代码例子:   *一般工作线程由自己实现,继承DoubleInsuredThead,在run2()方法里实现具体需求,和一般线程的运行()方法不同,run2 ()   *里不用处理循环和休眠检测线程已经由CheckThread实现,可以直接使用   *   * & lt; pre>   *启动用户检测线程   *公共静态孔隙startMonitor () {   * System.out.println(“启动用户会话检测线程”);   * UserMonitor工人=new UserMonitor (“XX-UserMonitor”);   * CheckThread检查=new CheckThread (“XX-UserMonitorCheck”, userMonitorIntevalTime);   * DoubleInsuredThead。startDoubleInsuredThead(工人、检验员);   *}   * & lt;/pre>   *   * @author yx   * @date 2019/12/21 0:36   */公共抽象类DoubleInsuredThead延伸线{/* *   *默认线程休眠时间为1000毫秒   */公共静态最终长DEFAULT_SLEEP_TIME=1000;/* *   *是否运行本线程   */私人布尔运行=true;/* *   *线程时间戳,每次运行的时候更新   */私人长时间戳=System.currentTimeMillis ();/* *   *互相检测的另外一个线程   */DoubleInsuredThead;      公共DoubleInsuredThead(字符串名称){   超级(名称);   }/* *   *子线程的执行业务的方法,相当于Runnable.run()方法   */公共抽象空白run2 ();/* *   *获得实例,重启线程的时候用   *   * @return   */公共抽象DoubleInsuredThead newInstance ();/* *   *启动工作线程,使用默认检测线程   *   * @param workerThread   */公共静态孔隙startDoubleInsuredThead (DoubleInsuredThead workerThread) {   CheckThread checkerThread=新CheckThread (workerThread.getName() +“检查”,workerThread.getSleepTime ());   workerThread。另一个=checkerThread;   checkerThread。另一个=workerThread;   workerThread.start ();   checkerThread.start ();   }/* *   *自定义检测线程的方式启动工作线程,建议使用startDoubleInsuredThead (DoubleInsuredThead workerThread)   *   * @param工人工作线程   * @param检验员检测线程   * @deprecated   */公共静态孔隙startDoubleInsuredThead (DoubleInsuredThead工人,   DoubleInsuredThead检验员){   工人。另一个=检查;   检查程序。另一个=工人;   worker.start ();   checker.start ();   }/* *   *重启线程   */公共空间重启(){   system . out。println(“线程\ " + getName() +”\“重新启动了”);//停止当前线程   运行=false;//启动新线程   DoubleInsuredThead t=newInstance ();   t.setTimeStamp (System.currentTimeMillis ());   另一个地方。另一个=t;   t。另一个=另一个;   t.start ();   }      @Override   公共空间run () {   (运行时){//执行子类线程的业务   run2 ();   checkAnother ();   setTimeStamp (System.currentTimeMillis ());      尝试{   thread . sleep (getSleepTime ());   }捕捉(InterruptedException e) {   e.printStackTrace ();   system . out。println(“线程休眠出错:“+ e.getMessage ());   }   }   }/* *   *获得线程休眠的时间,单位毫秒   *   * @return   */公共长getSleepTime () {   返回DEFAULT_SLEEP_TIME;   }/* *   *对另外一个线程进行检测   */私人空间checkAnother () {   如果(another.isTimeout ()) {   another.restart ();   }   }/* *   *是否更新时间戳超时   *   * @return   */私人布尔isTimeout () {   system . out。println(“时间戳=" + getTimeStamp ());   返回System.currentTimeMillis ()——getTimeStamp()比;getSleepTime () * 3;   }/* *   * @param时间戳的时间戳来设置   */公共空间setTimeStamp(长时间戳){   这。时间戳=时间戳;   }/* *   * @return时间戳   */公共长getTimeStamp () {   返回时间戳;   }      }

Java实现双保险线程的示例代码