解决:定时器运行状态下修改定时器周期。

一. 工具类


  1. public abstract class TimerTaskUtil extends TimerTask {
  2. public void setPeriod(long period) {
  3. //缩短周期,执行频率就提高
  4. setDeclaredField(TimerTask.class, this, "period", period);
  5. }
  6. //通过反射修改字段的值
  7. private boolean setDeclaredField(Class<?> clazz, Object obj, String name, Object value) {
  8. try {
  9. Field field = clazz.getDeclaredField(name);
  10. field.setAccessible(true);
  11. field.set(obj, value);
  12. return true;
  13. } catch (Exception ex) {
  14. ex.printStackTrace();
  15. return false;
  16. }
  17. }
  18. }

二. 测试类


  1. public static void main(String[] args) throws InterruptedException {
  2. TimerTaskUtil timerTaskUtil = new TimerTaskUtil() {
  3. @Override
  4. public void run() {
  5. System.out.println("执行时间:"+ new Date());
  6. }
  7. };
  8. Timer timer = new Timer();
  9. timer.schedule(timerTaskUtil,0,2000);
  10. //10s后切换成每1s执行一次
  11. Thread.sleep(10000);
  12. //设置新周期
  13. timerTaskUtil.setPeriod(1000);
  14. //10s后再次切换成2s执行一次
  15. Thread.sleep(10000);
  16. //设置新周期
  17. timerTaskUtil.setPeriod(2000);
  18. }