网站是如何建立的,建材 东莞网站建设,物联网应用有哪些,安庆市建设局网站首页双保险线程#xff0c;每次启动2个相同的线程#xff0c;互相检测#xff0c;避免线程死锁造成影响。两个线程都运行#xff0c;但只有一个线程执行业务#xff0c;但都会检测对方的时间戳 如果时间戳超过休眠时间3倍没有更新的话#xff0c;则重新启动对方线程。例子每次启动2个相同的线程互相检测避免线程死锁造成影响。两个线程都运行但只有一个线程执行业务但都会检测对方的时间戳 如果时间戳超过休眠时间3倍没有更新的话则重新启动对方线程。例子一般工作线程由自己实现继承DoubleInsuredThead在run2()方法里实现具体需求和一般线程的run()方法不同run2()里不用处理循环和休眠 检测线程已经由CheckThread实现可以直接使用如启动用户检测线程。public static void startMonitor() {System.out.println(启动用户会话检测线程);UserMonitor worker new UserMonitor(WT-UserMonitor);CheckThread checker new CheckThread(WT-UserMonitorCheck,userMonitorIntevalTime);DoubleInsuredThead.startDoubleInsuredThead(worker,checker);}完整代码package com.yx.demo.thread;/*** DoubleInsuredThead* 双保险线程每次启动2个相同的线程互相检测避免线程死锁造成影响。* * 两个线程都运行但只有一个线程执行业务但都会检测对方的时间戳 如果时间戳超过休眠时间3倍没有更新的话则重新启动对方线程* * 代码例子* 一般工作线程由自己实现继承DoubleInsuredThead在run2()方法里实现具体需求和一般线程的run()方法不同run2()* 里不用处理循环和休眠 检测线程已经由CheckThread实现可以直接使用** * 启动用户检测线程* public static void startMonitor() {* System.out.println(启动用户会话检测线程);* UserMonitor worker new UserMonitor(XX-UserMonitor);* CheckThread checker new CheckThread(XX-UserMonitorCheck,userMonitorIntevalTime);* DoubleInsuredThead.startDoubleInsuredThead(worker,checker);* }* ** author yx* date 2019/12/21 0:36*/public abstract class DoubleInsuredThead extends Thread {/*** 默认线程休眠时间为1000毫秒*/public static final long DEFAULT_SLEEP_TIME 1000;/*** 是否运行本线程*/private boolean running true;/*** 线程时间戳每次run的时候更新*/private long timeStamp System.currentTimeMillis();/*** 互相检测的另外一个线程*/DoubleInsuredThead another;public DoubleInsuredThead(String name) {super(name);}/*** 子线程的执行业务的方法相当于Runnable.run()方法*/public abstract void run2();/*** 获得实例重启线程的时候用** return*/public abstract DoubleInsuredThead newInstance();/*** 启动工作线程使用默认检测线程** param workerThread*/public static void startDoubleInsuredThead(DoubleInsuredThead workerThread) {CheckThread checkerThread new CheckThread(workerThread.getName() -checker,workerThread.getSleepTime());workerThread.another checkerThread;checkerThread.another workerThread;workerThread.start();checkerThread.start();}/*** 自定义检测线程的方式启动工作线程建议使用startDoubleInsuredThead(DoubleInsuredThead workerThread)** param worker 工作线程* param checker 检测线程* deprecated*/public static void startDoubleInsuredThead(DoubleInsuredThead worker,DoubleInsuredThead checker) {worker.another checker;checker.another worker;worker.start();checker.start();}/*** 重启线程*/public void restart() {System.out.println(线程\ getName() \重新启动了);// 停止当前线程running false;// 启动新线程DoubleInsuredThead t newInstance();t.setTimeStamp(System.currentTimeMillis());another.another t;t.another another;t.start();}Overridepublic void run() {while (running) {// 执行子类线程的业务run2();checkAnother();setTimeStamp(System.currentTimeMillis());try {Thread.sleep(getSleepTime());} catch (InterruptedException e) {e.printStackTrace();System.out.println(线程休眠出错 e.getMessage());}}}/*** 获得线程休眠的时间单位毫秒** return*/public long getSleepTime() {return DEFAULT_SLEEP_TIME;}/*** 对另外一个线程进行检测*/private void checkAnother() {if (another.isTimeout()) {another.restart();}}/*** 是否更新时间戳超时** return*/private boolean isTimeout() {System.out.println(timeStamp getTimeStamp());return System.currentTimeMillis() - getTimeStamp() getSleepTime() * 3;}/*** param timeStamp the timeStamp to set*/public void setTimeStamp(long timeStamp) {this.timeStamp timeStamp;}/*** return the timeStamp*/public long getTimeStamp() {return timeStamp;}}检测线程package com.yx.demo.thread;/*** CheckThread* 双保险线程里专门用来检测的线程** author yx* date 2019/12/21 0:38*/public class CheckThread extends DoubleInsuredThead {/*** 检测休眠时间默认1秒*/private long checkIntevalTime 1000;public CheckThread(String name,long checkTime) {super(name);this.checkIntevalTime checkTime;}Overridepublic DoubleInsuredThead newInstance() {return new CheckThread(getName(),checkIntevalTime);}Overridepublic void run2() {// 只打印信息System.out.println(线程 getName() 完成了工作);}Overridepublic long getSleepTime() {return checkIntevalTime;}/*** 测试代码** param args*/public static void main(String[] args) {CheckThread worker new CheckThread(worker,3000);DoubleInsuredThead.startDoubleInsuredThead(worker);}}以上就是本文的全部内容希望对大家的学习有所帮助也希望大家多多支持我们。相关文章总结以上是编程之家为你收集整理的Java实现双保险线程的示例代码全部内容希望文章能够帮你解决Java实现双保险线程的示例代码所遇到的程序开发问题。如果觉得编程之家网站内容还不错欢迎将编程之家网站推荐给程序员好友。本图文内容来源于网友网络收集整理提供作为学习参考使用版权属于原作者。如您喜欢交流学习经验点击链接加入交流1群1065694478(已满)交流2群163560250