双保险线程,每次启动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实现双保险线程的示例代码