一看就懂!Java开发:定时操作类:Timer介绍 -定时执行你的代码

经常看到需求,定时多久后订单失效或者订单更换状态这类定时调度任务

什么是定时任务调度:基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务。

在Java中的定时调度工具有Timer、Quartz,本篇讲述一下Timer

 

java.util.Timer
java.util.TimerTask

从JDKAPI中得知

Timer:

一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。

对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。默认情况下,任务执行线程并不作为守护线程 来运行,所以它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程,那么调用者应该调用计时器的 cancel 方法。

如果意外终止了计时器的任务执行线程,例如调用了它的 stop 方法,那么所有以后对该计时器安排任务的尝试都将导致 IllegalStateException,就好像调用了计时器的 cancel 方法一样。

此类是线程安全的:多个线程可以共享单个 Timer 对象而无需进行外部同步。

此类 提供实时保证:它使用 Object.wait(long) 方法来安排任务。

实现注意事项:此类可扩展到大量同时安排的任务(存在数千个都没有问题)。在内部,它使用二进制堆来表示其任务队列,所以安排任务的开销是 O(log n),其中 n 是同时安排的任务数。

实现注意事项:所有构造方法都启动计时器线程。

 构造方法和方法如下:

 TimerTask:

为 Timer 安排为一次执行或重复执行的任务。

 构造方法和方法如下:

实战:

Timer亦可用于操作数据库


    @RequestMapping("/add")
    @ResponseBody
    public Result addPerson(@RequestBody Person person) {

        personRepository.save(person);
        int time = 10 * 1000; //延迟时间
        Timer timer = new Timer();
        
        timer.schedule(new TimerTask() {
            //匿名内部类run()方法写延迟后执行的代码
            @Override
            public void run() {
                 person.setName("定时修改人名");
                 personRepository.save(person);
            }
        }, time);//延迟时间到后 修改数据库里人名

        return Result.ok(person);
    }

一开始数据库里是页面传来的人名,十秒(10*1000ms)后就被修改成"定时修改人名".并且由于是多线程执行,并不影响原先代码的执行。这种延期执行的代码其实并不好用,万一你的服务器跑着跑着崩了,定时任务就会停止且不会重新执行,就会造成数据不正确现象。因此我更推荐你采用另一种思路,定时刷新。

假设我们需要将十分钟前的订单修改成过期,可以设置定时器,每十分钟,发送一起请求,将数据库中数据大于十分钟,并且未设置成过期的记录修改。这会消耗性能,好处是保证宕机后数据会及时更新。

在Springboot中提供了Scheduled,在另一篇文章我再详细介绍。


有什么问题可以评论或者私信我,每日在线解(LIAO)疑(SAO)。

我是大誌,一位准备996的卑微码农🐶,觉得好用记得点赞收藏!!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大誌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值