import java.util.concurrent.TimeUnit; import java.util.function.Supplier; public class RetryUtils { private static final long BASE_WAIT_MS = 500; private static final int MAX_ATTEMPTS = 5; public static T executeWithRetry(Supplier supplier) throws NetworkException { int attempt = 0; while (true) { try { return supplier.get(); } catch (Exception e) { attempt++; if (attempt >= MAX_ATTEMPTS) { throw new NetworkException("重试失败,已达最大重试次数", e); } long waitTime = calculateWaitTime(attempt); System.out.println("重试失败,等待 " + waitTime + "ms 后重试... (第 " + attempt + " 次尝试)"); try { TimeUnit.MILLISECONDS.sleep(waitTime); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new NetworkException("重试被中断", ie); } } } } private static long calculateWaitTime(int attempt) { // 指数退避公式:wait = base * 2^attempt return BASE_WAIT_MS * (long) Math.pow(2, attempt); } }