在这个timerfun函数中去加入这一部分为什么会报错,没太学过匿名类

在这个timerfun函数中去加入这一部分为什么会报错,没太学过匿名类。

img

你这框里的代码应该写在方法体内,不能在成员位置。你可以将它们写到run方法内。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/176363
  • 这篇博客你也可以参考下:关于Timer定时器出现异常时,整个定时任务就中断了。
  • 除此之外, 这篇博客: 关于定时器Timer类的使用中的 关于定时器Timer类: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1、定时器的作用

    间隔特定的时间,执行特定的程序。


    2、在实际开发中,每隔一定的时间执行一段特定的程序,这种需求是很常见的, 那么在java中其实可以采用多种方式实现。

    (1)可以使用Thread.sleep()方法,睡眠,设置好休眠的时间,
    在特定的时间醒来,这种方式是最原始的定时器,比较低级。

    (2)在java的类库中已经写好了一个定时器:java.util.Timer,可以直接拿来用。

    不过,这种方式在目前的开发中也很少用,因为现在有很多高级框架都是支持定时任务的。

    (3)目前使用较多的是Spring框架中提供的SpringTask框架。
    这个框架只要进行简单的配置,就可以完成定时器的任务。


    3、不管是什么框架的定时器,它的实现原理一般都是采用java.util.Timer实现的,所以有必要学习一下Timer这个类。

    测试代码:

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class Test12 {
        public static void main(String[] args) {
    
            // 创建定时器对象
            Timer timer = new Timer();
            //Timer timer1 = new Timer();  // 设置成守护线程的方式
    
            // 指定定时任务
            //timer.schedule(TimerTask task, Date firestTime, long period);  // 三个参数:定时任务,第一次执行时间,间隔的毫秒数
    
            // 先指定第一次执行时间,假设为:2020-7-25 10:17:20
            // 获取时间对象
            String str = "2020-7-25 10:17:20";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date firstTime = null;
            try {
                firstTime = sdf.parse(str);
            } catch (ParseException e) {
                e.printStackTrace();
            }
    
            // 假设每5秒执行一次
            long period = 5 * 1000L;
    
            /*
                再来看第一个参数,第一个参数的类型为TimerTask,这是一个抽象类,不能实例化的。
                这个TimerTask抽象类已经实现了Runnable接口,是一个线程运行类。
                而这个TimerTask抽象类并没有子类,要求我们自己去写一个子类,继承TimerTask类,并重写抽象方法。
            */
    
            // 创建TimeTask对象
            TimerTask task = new MyTask();
    
            // 三个参数已经凑齐,开始执行定时任务
            timer.schedule(task, firstTime, period);
    
            // 也可以采用匿名内部类,直接new抽象类
            /*
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    // 任务代码块
                }
            }, firstTime, 5000L);
             */
    
        }
    }
    
    // 定义一个指定任务的类,继承TimerTask抽象类
    class MyTask extends TimerTask {
    
        @Override
        public void run() {
            Date nowTime = new Date();
            System.out.println(Thread.currentThread().getName() + ":" + nowTime);
        }
    }
    

    运行截图:
    在这里插入图片描述


  • 您还可以看一下 肖海鹏老师的项目实战:大型分布式连锁酒店系统课程中的 Timer的使用示例小节, 巩固相关知识点