解决:定时器运行状态下修改定时器周期。
一. 工具类
public abstract class TimerTaskUtil extends TimerTask {
public void setPeriod(long period) {
//缩短周期,执行频率就提高
setDeclaredField(TimerTask.class, this, "period", period);
}
//通过反射修改字段的值
private boolean setDeclaredField(Class<?> clazz, Object obj, String name, Object value) {
try {
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(obj, value);
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
}
二. 测试类
public static void main(String[] args) throws InterruptedException {
TimerTaskUtil timerTaskUtil = new TimerTaskUtil() {
@Override
public void run() {
System.out.println("执行时间:"+ new Date());
}
};
Timer timer = new Timer();
timer.schedule(timerTaskUtil,0,2000);
//10s后切换成每1s执行一次
Thread.sleep(10000);
//设置新周期
timerTaskUtil.setPeriod(1000);
//10s后再次切换成2s执行一次
Thread.sleep(10000);
//设置新周期
timerTaskUtil.setPeriod(2000);
}