Java实现双保险线程的示例代码
双保险线程,每次启动2个相同的线程,互相检测,避免线程死锁造成影响。
两个线程都运行,但只有一个线程执行业务,但都会检测对方的时间戳如果时间戳超过休眠时间3倍没有更新的话,则重新启动对方线程。
例子:
一般工作线程由自己实现,继承DoubleInsuredThead,在run2()方法里实现具体需求,和一般线程的run()方法不同,run2()里不用处理循环和休眠检测线程已经由CheckThread实现,可以直接使用,如:启动用户检测线程。
publicstaticvoidstartMonitor(){ System.out.println("启动用户会话检测线程"); UserMonitorworker=newUserMonitor("WT-UserMonitor"); CheckThreadchecker=newCheckThread("WT-UserMonitorCheck",userMonitorIntevalTime); DoubleInsuredThead.startDoubleInsuredThead(worker,checker); }
完整代码:
packagecom.yx.demo.thread; /** *DoubleInsuredThead *双保险线程,每次启动2个相同的线程,互相检测,避免线程死锁造成影响。 **两个线程都运行,但只有一个线程执行业务,但都会检测对方的时间戳如果时间戳超过休眠时间3倍没有更新的话,则重新启动对方线程 *
*代码例子: *一般工作线程由自己实现,继承DoubleInsuredThead,在run2()方法里实现具体需求,和一般线程的run()方法不同,run2() *里不用处理循环和休眠检测线程已经由CheckThread实现,可以直接使用 * *
*启动用户检测线程 *publicstaticvoidstartMonitor(){ *System.out.println("启动用户会话检测线程"); *UserMonitorworker=newUserMonitor("XX-UserMonitor"); *CheckThreadchecker=newCheckThread("XX-UserMonitorCheck",userMonitorIntevalTime); *DoubleInsuredThead.startDoubleInsuredThead(worker,checker); *} ** *@authoryx *@date2019/12/210:36 */ publicabstractclassDoubleInsuredTheadextendsThread{ /** *默认线程休眠时间为1000毫秒 */ publicstaticfinallongDEFAULT_SLEEP_TIME=1000; /** *是否运行本线程 */ privatebooleanrunning=true; /** *线程时间戳,每次run的时候更新 */ privatelongtimeStamp=System.currentTimeMillis(); /** *互相检测的另外一个线程 */ DoubleInsuredTheadanother; publicDoubleInsuredThead(Stringname){ super(name); } /** *子线程的执行业务的方法,相当于Runnable.run()方法 */ publicabstractvoidrun2(); /** *获得实例,重启线程的时候用 * *@return */ publicabstractDoubleInsuredTheadnewInstance(); /** *启动工作线程,使用默认检测线程 * *@paramworkerThread */ publicstaticvoidstartDoubleInsuredThead(DoubleInsuredTheadworkerThread){ CheckThreadcheckerThread= newCheckThread(workerThread.getName()+"-checker",workerThread.getSleepTime()); workerThread.another=checkerThread; checkerThread.another=workerThread; workerThread.start(); checkerThread.start(); } /** *自定义检测线程的方式启动工作线程,建议使用startDoubleInsuredThead(DoubleInsuredTheadworkerThread) * *@paramworker工作线程 *@paramchecker检测线程 *@deprecated */ publicstaticvoidstartDoubleInsuredThead(DoubleInsuredTheadworker, DoubleInsuredTheadchecker){ worker.another=checker; checker.another=worker; worker.start(); checker.start(); } /** *重启线程 */ publicvoidrestart(){ System.out.println("线程\""+getName()+"\"重新启动了"); //停止当前线程 running=false; //启动新线程 DoubleInsuredTheadt=newInstance(); t.setTimeStamp(System.currentTimeMillis()); another.another=t; t.another=another; t.start(); } @Override publicvoidrun(){ while(running){ //执行子类线程的业务 run2(); checkAnother(); setTimeStamp(System.currentTimeMillis()); try{ Thread.sleep(getSleepTime()); }catch(InterruptedExceptione){ e.printStackTrace(); System.out.println("线程休眠出错:"+e.getMessage()); } } } /** *获得线程休眠的时间,单位毫秒 * *@return */ publiclonggetSleepTime(){ returnDEFAULT_SLEEP_TIME; } /** *对另外一个线程进行检测 */ privatevoidcheckAnother(){ if(another.isTimeout()){ another.restart(); } } /** *是否更新时间戳超时 * *@return */ privatebooleanisTimeout(){ System.out.println("timeStamp="+getTimeStamp()); returnSystem.currentTimeMillis()-getTimeStamp()>getSleepTime()*3; } /** *@paramtimeStampthetimeStamptoset */ publicvoidsetTimeStamp(longtimeStamp){ this.timeStamp=timeStamp; } /** *@returnthetimeStamp */ publiclonggetTimeStamp(){ returntimeStamp; } }
检测线程:
packagecom.yx.demo.thread; /** *CheckThread *双保险线程里专门用来检测的线程 * *@authoryx *@date2019/12/210:38 */ publicclassCheckThreadextendsDoubleInsuredThead{ /** *检测休眠时间,默认1秒 */ privatelongcheckIntevalTime=1000; publicCheckThread(Stringname,longcheckTime){ super(name); this.checkIntevalTime=checkTime; } @Override publicDoubleInsuredTheadnewInstance(){ returnnewCheckThread(getName(),checkIntevalTime); } @Override publicvoidrun2(){ //只打印信息 System.out.println("线程"+getName()+"完成了工作"); } @Override publiclonggetSleepTime(){ returncheckIntevalTime; } /** *测试代码 * *@paramargs */ publicstaticvoidmain(String[]args){ CheckThreadworker=newCheckThread("worker",3000); DoubleInsuredThead.startDoubleInsuredThead(worker); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。