You need to enable JavaScript to run this app. Java同步执行问题:如何实现运行指定时长后等待再重复的Timer功能
优惠活动
大模型
产品
解决方案
定价
更多

Java同步执行问题:如何实现运行指定时长后等待再重复的Timer功能

Java 定时循环执行(业务+等待)实现方案

核心问题说明

Timer.scheduleAtFixedRate() 是以首次调度时间为基准固定间隔触发任务,不会等待上一次任务执行完成后再计算间隔时间,因此无法实现「业务执行结束后再等待固定时长」的需求。

可行实现方案

方案1:基于 Timer 自定义循环逻辑

直接在TimerTask的run方法中按顺序实现「业务执行->固定等待」的循环即可,无需使用固定频率调度方法,示例代码如下:

import java.util.Timer;
import java.util.TimerTask;

public class BusinessCycleTimer {
    // 业务运行时长(单位:毫秒,实际场景可根据业务逻辑自行控制,无需固定sleep)
    private static final long BUSINESS_EXECUTE_TIME = 10 * 1000;
    // 业务执行完成后的固定等待时长(单位:毫秒)
    private static final long WAIT_AFTER_BUSINESS = 5 * 1000;

    public static void main(String[] args) {
        Timer timer = new Timer("business-cycle-timer");
        // 0表示首次启动无延迟,可根据需求调整首次启动延迟时间
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                while (!Thread.currentThread().isInterrupted()) {
                    try {
                        // --------------------------
                        // 此处替换为实际业务代码
                        System.out.println("业务进程启动");
                        Thread.sleep(BUSINESS_EXECUTE_TIME);
                        System.out.println("业务进程执行结束");
                        // --------------------------
                        
                        // 执行固定时长等待
                        Thread.sleep(WAIT_AFTER_BUSINESS);
                    } catch (InterruptedException e) {
                        // 响应中断,退出循环
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            }
        }, 0);
    }
}

方案2:基于 ScheduledExecutorService 实现(更推荐)

ScheduledExecutorService是JDK1.5之后推出的调度工具类,稳定性、异常处理能力都优于Timer,更推荐生产环境使用,示例代码如下:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class BusinessCycleExecutor {
    private static final long WAIT_AFTER_BUSINESS = 5 * 1000;

    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
        executor.submit(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    // 执行业务逻辑
                    doBusinessWork();
                    // 业务执行完成后等待固定时长
                    TimeUnit.MILLISECONDS.sleep(WAIT_AFTER_BUSINESS);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        });
    }

    private static void doBusinessWork() {
        // 替换为实际业务代码
        System.out.println("执行业务逻辑");
    }
}

流程示意

流程参考示意图

内容的提问来源于stack exchange,提问作者user13964799

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 20:06:02