日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java开发保险案例_Java实现双保险线程的示例代码

發(fā)布時(shí)間:2023/12/4 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java开发保险案例_Java实现双保险线程的示例代码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

雙保險(xiǎn)線程,每次啟動(dòng)2個(gè)相同的線程,互相檢測(cè),避免線程死鎖造成影響。

兩個(gè)線程都運(yùn)行,但只有一個(gè)線程執(zhí)行業(yè)務(wù),但都會(huì)檢測(cè)對(duì)方的時(shí)間戳 如果時(shí)間戳超過休眠時(shí)間3倍沒有更新的話,則重新啟動(dòng)對(duì)方線程。

例子:

一般工作線程由自己實(shí)現(xiàn),繼承DoubleInsuredThead,在run2()方法里實(shí)現(xiàn)具體需求,和一般線程的run()方法不同,run2()里不用處理循環(huán)和休眠 檢測(cè)線程已經(jīng)由CheckThread實(shí)現(xiàn),可以直接使用,如:啟動(dòng)用戶檢測(cè)線程。

public static void startMonitor() {

System.out.println("啟動(dòng)用戶會(huì)話檢測(cè)線程");

UserMonitor worker = new UserMonitor("WT-UserMonitor");

CheckThread checker = new CheckThread("WT-UserMonitorCheck",userMonitorIntevalTime);

DoubleInsuredThead.startDoubleInsuredThead(worker,checker);

}

完整代碼:

package com.yx.demo.thread;

/**

* DoubleInsuredThead

* 雙保險(xiǎn)線程,每次啟動(dòng)2個(gè)相同的線程,互相檢測(cè),避免線程死鎖造成影響。

*

* 兩個(gè)線程都運(yùn)行,但只有一個(gè)線程執(zhí)行業(yè)務(wù),但都會(huì)檢測(cè)對(duì)方的時(shí)間戳 如果時(shí)間戳超過休眠時(shí)間3倍沒有更新的話,則重新啟動(dòng)對(duì)方線程

*

* 代碼例子:

* 一般工作線程由自己實(shí)現(xiàn),繼承DoubleInsuredThead,在run2()方法里實(shí)現(xiàn)具體需求,和一般線程的run()方法不同,run2()

* 里不用處理循環(huán)和休眠 檢測(cè)線程已經(jīng)由CheckThread實(shí)現(xiàn),可以直接使用

*

*

* 啟動(dòng)用戶檢測(cè)線程

* public static void startMonitor() {

* System.out.println("啟動(dòng)用戶會(huì)話檢測(cè)線程");

* 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 {

/**

* 默認(rèn)線程休眠時(shí)間為1000毫秒

*/

public static final long DEFAULT_SLEEP_TIME = 1000;

/**

* 是否運(yùn)行本線程

*/

private boolean running = true;

/**

* 線程時(shí)間戳,每次run的時(shí)候更新

*/

private long timeStamp = System.currentTimeMillis();

/**

* 互相檢測(cè)的另外一個(gè)線程

*/

DoubleInsuredThead another;

public DoubleInsuredThead(String name) {

super(name);

}

/**

* 子線程的執(zhí)行業(yè)務(wù)的方法,相當(dāng)于Runnable.run()方法

*/

public abstract void run2();

/**

* 獲得實(shí)例,重啟線程的時(shí)候用

*

* @return

*/

public abstract DoubleInsuredThead newInstance();

/**

* 啟動(dòng)工作線程,使用默認(rèn)檢測(cè)線程

*

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

}

/**

* 自定義檢測(cè)線程的方式啟動(dòng)工作線程,建議使用startDoubleInsuredThead(DoubleInsuredThead workerThread)

*

* @param worker 工作線程

* @param checker 檢測(cè)線程

* @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() + "\"重新啟動(dòng)了");

// 停止當(dāng)前線程

running = false;

// 啟動(dòng)新線程

DoubleInsuredThead t = newInstance();

t.setTimeStamp(System.currentTimeMillis());

another.another = t;

t.another = another;

t.start();

}

@Override

public void run() {

while (running) {

// 執(zhí)行子類線程的業(yè)務(wù)

run2();

checkAnother();

setTimeStamp(System.currentTimeMillis());

try {

Thread.sleep(getSleepTime());

} catch (InterruptedException e) {

e.printStackTrace();

System.out.println("線程休眠出錯(cuò):" + e.getMessage());

}

}

}

/**

* 獲得線程休眠的時(shí)間,單位毫秒

*

* @return

*/

public long getSleepTime() {

return DEFAULT_SLEEP_TIME;

}

/**

* 對(duì)另外一個(gè)線程進(jìn)行檢測(cè)

*/

private void checkAnother() {

if (another.isTimeout()) {

another.restart();

}

}

/**

* 是否更新時(shí)間戳超時(shí)

*

* @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;

}

}

檢測(cè)線程:

package com.yx.demo.thread;

/**

* CheckThread

* 雙保險(xiǎn)線程里專門用來檢測(cè)的線程

*

* @author yx

* @date 2019/12/21 0:38

*/

public class CheckThread extends DoubleInsuredThead {

/**

* 檢測(cè)休眠時(shí)間,默認(rèn)1秒

*/

private long checkIntevalTime = 1000;

public CheckThread(String name,long checkTime) {

super(name);

this.checkIntevalTime = checkTime;

}

@Override

public DoubleInsuredThead newInstance() {

return new CheckThread(getName(),checkIntevalTime);

}

@Override

public void run2() {

// 只打印信息

System.out.println("線程" + getName() + "完成了工作");

}

@Override

public long getSleepTime() {

return checkIntevalTime;

}

/**

* 測(cè)試代碼

*

* @param args

*/

public static void main(String[] args) {

CheckThread worker = new CheckThread("worker",3000);

DoubleInsuredThead.startDoubleInsuredThead(worker);

}

}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

相關(guān)文章

總結(jié)

以上是編程之家為你收集整理的Java實(shí)現(xiàn)雙保險(xiǎn)線程的示例代碼全部?jī)?nèi)容,希望文章能夠幫你解決Java實(shí)現(xiàn)雙保險(xiǎn)線程的示例代碼所遇到的程序開發(fā)問題。

如果覺得編程之家網(wǎng)站內(nèi)容還不錯(cuò),歡迎將編程之家網(wǎng)站推薦給程序員好友。

本圖文內(nèi)容來源于網(wǎng)友網(wǎng)絡(luò)收集整理提供,作為學(xué)習(xí)參考使用,版權(quán)屬于原作者。

如您喜歡交流學(xué)習(xí)經(jīng)驗(yàn),點(diǎn)擊鏈接加入交流1群:1065694478(已滿)交流2群:163560250

總結(jié)

以上是生活随笔為你收集整理的java开发保险案例_Java实现双保险线程的示例代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。