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

