java开发当中的定时器任务调度

项目当中有时需要在一些业务场景中执行定时操作来完成一些周期性的任务,比如定时从别的资源系统当中抓取和更新系统的数据、定时删除数据库中的历史数据、定时进行数据备份等。

定时器任务常用的解决方案:

第一种:使用Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。 最早的时候就是这样写定时任务的。 

但是Timer和TimerTask存在一些缺陷:

Timer只创建了一个线程。当你的任务执行的时间超过设置的延时时间将会产生一些问题。

Timer创建的线程没有处理异常,因此一旦抛出非受检异常,该线程会立即终止。

第二种:使用 开源的第三方框架: Quartz 或者 elastic-job , 但是这个比较复杂和重量级,适用于分布式场景下的定时任务,可以根据需要多实例部署定时任务。 
第三种:使用Spring提供的注解: @Schedule 。 如果定时任务执行时间较短,并且比较单一,可以使用这个注解。
但是在修改服务器时间时会导致定时任务不执行情况的发生,解决的办法是当修改服务器时间后,将服务进行重启就可以避免此现象的发生。

如每天晚上10点到第二天7点,每15分钟执行一次

@Scheduled(cron = "0 0/15 0,1,2,3,4,5,6,22,23 * * ?")

第四种:使用ScheduledThreadPoolExecutor,它任务的调度是基于相对时间的

public class TestScheduledExecutorService {
    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 参数:1、任务体 2、首次执行的延时时间
        //      3、任务执行间隔 4、间隔时间单位
        service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值