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
相关产品推荐
相关产品推荐

