【JAVA】【重试间隔】多线程中两种常见的重试间隔
2025-05-03 07:46 阅读(47)

一、前言


报!! 小南啊,今日有个小任务交给你去办。就是程序中有个数据处理,总是会出错,不知道是什么原因,你去处理一下!


二、主题

围绕数据处理问题去看,从中发现,是因为在多线程中,出现异常处理的时候,一下子就立马重试了,导致频频重试也是出错!一下子重试次数就达到了,导致并没有很好的缓冲效果。因此...

三、重试间隔

原始代码

package com.nan.task;  
  
import lombok.extern.slf4j.Slf4j;  
  
import java.io.IOException;  
  
/**  
* @Author nanfang  
* @Description TODO: Description  
* @Date 2025/5/2 
**/  
@Slf4j  
public class NanTask {  
    // 重试次数  
    private final static int MAX_RETRY = 5;  
    public static void main(String[] args) {  
        // 程序开始  
        log.info("nan task start");  
        int retry = 0;  
        while (retry < MAX_RETRY) {  
            try {  
                // 处理程序,默认会出错报错(抛出异常)  
                process();  
            } catch (Exception e) {  
                log.error("执行定时任务发生异常,准备执行第" + (retry + 1) + "次重试");  
                retry++;  
            }  
        }  
        log.info("nan task end");  
    }  
  
  
  /**  
    * TODO: 进程处理  
    *  
    * @Author nanfang  
    * @Date 2025/5/2  
    **/  
    private static void process() throws IOException {  
        // 抛出异常  
        throw new IOException("nan task error");  
    }  
  
  
}

重试间隔

【相同间隔】

   /**
     * TODO: 时间间隔相同
     *
     * @Author nanfang
     * @Date 2025/5/2
     **/
    private static void sameSleep(int retry, int tiems) throws InterruptedException {
        log.info("same sleep start");
        if (retry > 0) {
            Thread.sleep(tiems);
            log.error("过去了{}秒", tiems);
        }
        log.info("same sleep end");
    }

【递增间隔】

    /**
     * TODO: 时间间隔递增
     *
     * @Author nanfang
     * @Date 2025/5/2
     **/
    private static void progressSleep(int retry) throws InterruptedException {
        log.info("progress sleep start");
        if (retry > 0) {
            // 当第一次重试,休眠 1 秒;第二次,休眠 2 秒;第三次,休眠 3 秒
            int times = retry * 2 * 1000;
            Thread.sleep(times);
            log.error("过去了{}秒", retry * 2);
        }
        log.info("progress sleep end");
    }

四、完整代码

package com.nan.task;  

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

/**
 * @Author nanfang
 * @Description TODO: Description
 * @Date 2025/4/29
 **/

@Slf4j
public class NanTask {
    // 重试次数
    private final static int MAX_RETRY = 5;

    public static void main(String[] args) {
        // 程序开始
        log.info("nan task start");
        int retry = 0;
        while (retry < MAX_RETRY) {
            try {
                // 相同间隔时间
                // int sleepSameTime = 1;
                // sameSleep(retry, sleepSameTime * 1000);
                // 递增间隔时间
                progressSleep(retry);
                // 处理程序,默认会出错报错(抛出异常)
                process();
            } catch (Exception e) {
                log.error("执行定时任务发生异常,准备执行第" + (retry + 1) + "次重试");
                retry++;
            }
        }
        log.info("nan task end");
    }

    /**
     * TODO: 时间间隔相同
     *
     * @Author nanfang
     * @Date 2025/5/2
     **/
    private static void sameSleep(int retry, int tiems) throws InterruptedException {
        log.info("same sleep start");
        if (retry > 0) {
            Thread.sleep(tiems);
            log.error("过去了{}秒", tiems);
        }
        log.info("same sleep end");
    }

    /**
     * TODO: 时间间隔递增
     *
     * @Author nanfang
     * @Date 2025/5/2
     **/
    private static void progressSleep(int retry) throws InterruptedException {
        log.info("progress sleep start");
        if (retry > 0) {
            // 当第一次重试,休眠 1 秒;第二次,休眠 2 秒;第三次,休眠 3 秒
            int times = retry * 2 * 1000;
            Thread.sleep(times);
            log.error("过去了{}秒", retry * 2);
        }
        log.info("progress sleep end");
    }

    /**
     * TODO: 进程处理
     *
     * @Author nanfang
     * @Date 2025/4/29
     **/
    private static void process() throws IOException {
        // 抛出异常
        throw new IOException("nan task error");
    }


}

五、运行结果

【相同时间间隔】

【递增时间间隔】

https://www.zuocode.com