欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)雙保險線程的示例代碼

 更新時間:2019年12月23日 08:34:37   作者:IT_熊  
這篇文章主要介紹了Java實現(xiàn)雙保險線程的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

雙保險線程,每次啟動2個相同的線程,互相檢測,避免線程死鎖造成影響。

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

例子:

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

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個相同的線程,互相檢測,避免線程死鎖造成影響。
 * <p>
 * 兩個線程都運行,但只有一個線程執(zhí)行業(yè)務(wù),但都會檢測對方的時間戳 如果時間戳超過休眠時間3倍沒有更新的話,則重新啟動對方線程
 * <p>
 * 代碼例子:
 * 一般工作線程由自己實現(xiàn),繼承DoubleInsuredThead,在run2()方法里實現(xiàn)具體需求,和一般線程的run()方法不同,run2()
 * 里不用處理循環(huán)和休眠 檢測線程已經(jīng)由CheckThread實現(xiàn),可以直接使用
 *
 * <pre>
 *  啟動用戶檢測線程
 *  public static void startMonitor() {
 *  System.out.println("啟動用戶會話檢測線程");
 *  UserMonitor worker = new UserMonitor("XX-UserMonitor");
 *  CheckThread checker = new CheckThread("XX-UserMonitorCheck",userMonitorIntevalTime);
 *  DoubleInsuredThead.startDoubleInsuredThead(worker, checker);
 *    }
 * </pre>
 *
 * @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);
  }
 
  /**
   * 子線程的執(zhí)行業(yè)務(wù)的方法,相當(dāng)于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() + "\"重新啟動了");
    // 停止當(dāng)前線程
    running = false;
    // 啟動新線程
    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("線程休眠出錯:" + 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;
  }
 
  @Override
  public DoubleInsuredThead newInstance() {
    return new CheckThread(getName(), checkIntevalTime);
  }
 
  @Override
  public void run2() {
    // 只打印信息
    System.out.println("線程" + getName() + "完成了工作");
  }
 
  @Override
  public long getSleepTime() {
    return checkIntevalTime;
  }
 
  /**
   * 測試代碼
   *
   * @param args
   */
  public static void main(String[] args) {
    CheckThread worker = new CheckThread("worker", 3000);
    DoubleInsuredThead.startDoubleInsuredThead(worker);
  }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于elcipse 安裝lombok插件解決 @Slf4j 等找不到log變量問題

    關(guān)于elcipse 安裝lombok插件解決 @Slf4j 等找不到log變量問題

    這篇文章主要介紹了關(guān)于elcipse 安裝lombok插件解決 @Slf4j 等找不到log變量問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java實現(xiàn)復(fù)原IP地址的方法

    Java實現(xiàn)復(fù)原IP地址的方法

    這篇文章主要介紹了Java實現(xiàn)復(fù)原IP地址的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • java編程實現(xiàn)兩個大數(shù)相加代碼示例

    java編程實現(xiàn)兩個大數(shù)相加代碼示例

    這篇文章主要介紹了java編程實現(xiàn)兩個大數(shù)相加代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • IDEA解決maven包沖突easypoi NoClassDefFoundError的問題

    IDEA解決maven包沖突easypoi NoClassDefFoundError的問題

    這篇文章主要介紹了IDEA解決maven包沖突easypoi NoClassDefFoundError的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Spring?Boot?優(yōu)雅停機原理詳解

    Spring?Boot?優(yōu)雅停機原理詳解

    這篇文章主要為大家介紹了Spring?Boot?優(yōu)雅停機原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Springboot傳輸數(shù)據(jù)時日期格式化問題

    Springboot傳輸數(shù)據(jù)時日期格式化問題

    這篇文章主要介紹了Springboot傳輸數(shù)據(jù)時日期格式化問題,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • Java Set簡介_動力節(jié)點Java學(xué)院整理

    Java Set簡介_動力節(jié)點Java學(xué)院整理

    Set最大的特性就是不允許在其中存放的元素是重復(fù)的。接下來通過本文給大家分享java set常用方法和原理分析,需要的的朋友參考下吧
    2017-05-05
  • Java使用Jedis操作Redis服務(wù)器的實例代碼

    Java使用Jedis操作Redis服務(wù)器的實例代碼

    本篇文章主要介紹了Java使用Jedis操作Redis服務(wù)器的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • java后臺處理前端傳的json串方法

    java后臺處理前端傳的json串方法

    今天小編就為大家分享一篇java后臺處理前端傳的json串方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Java基于外觀模式實現(xiàn)美食天下食譜功能實例詳解

    Java基于外觀模式實現(xiàn)美食天下食譜功能實例詳解

    這篇文章主要介紹了Java基于外觀模式實現(xiàn)美食天下食譜功能,較為詳細的講述了外觀模式的概念、原理并結(jié)合實例形似詳細分析了Java基于外觀模式實現(xiàn)美食天下食譜功能的具體操作步驟與相關(guān)注意事項,需要的朋友可以參考下
    2018-05-05

最新評論