You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Timer定时任务中volatile变量totalTime无法持续累加如何解决?

问题原因

核心问题是调用了错误的Timer调度重载方法:
你当前使用的timer.schedule(TimerTask task, long delay)方法,作用仅为等待指定延迟时间后执行一次定时任务,不会周期性重复触发,因此totalTime只会累加1次后就不再变化,该问题和volatile修饰符无关。

解决方案

将调度方法替换为支持周期执行的重载即可,有两种常用实现可选:

方案1:固定延迟周期执行

使用schedule(TimerTask task, long delay, long period)重载,第三个参数为两次任务执行的间隔毫秒数,若单次任务执行耗时超过间隔时间,下一次执行时间会自动顺延:

timer.schedule(new TimerTask() {
    @Override
    public void run() {
        totalTime += 1000;
    }
}, 1000, 1000);

方案2:固定频率执行

如果需要严格按照固定频率触发任务,不受单次任务耗时影响,可以使用scheduleAtFixedRate(TimerTask task, long delay, long period)重载:

timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        totalTime += 1000;
    }
}, 1000, 1000);

修正后完整可运行代码如下:

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

public class Main {
    public static volatile long totalTime = 0;

    public static void main(String ... args){
        Timer timer = new Timer();
        // 替换为周期调度方法
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                totalTime +=1000;
            }
        }, 1000, 1000);
        for (int i = 0; i<10; i++) {
            System.out.println(totalTime);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 任务执行结束后关闭Timer释放资源
        timer.cancel();
    }
}

运行后即可输出你预期的逐秒递增结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 03:54:05