Java定时任务详解(Timer、线程池、Quartz、SpringTask)

本文详细介绍了Java定时任务的实现方式,包括Java自带的Timer和ScheduledExecutorService,以及Quartz和SpringTask框架。Quartz的配置涉及作业类、触发器和调度工厂,SpringTask则提供配置文件和注解两种方式。
摘要由CSDN通过智能技术生成

·介绍

从实现的技术上来看,目前主要有以下三种方式:

  • Java自带工具实现:使用这种方式可以让你的程序按照某一个频度执行。本文将介绍两种方式(Timer、ScheduledExecutorService)。
  • 使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
  • SpringTask,Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。

·实现

方法一:Java自带工具实现

Timer(java.util.Timer)

       Timer有两种方法schedulescheduleAtFixedRate实现定时任务。注意:Timer会在任务开始就计算时间。

       Timer 的优点在于简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,上一个任务执行结束才会接着执行下一个任务,前一个任务的延迟或异常都将会影响到之后的任务。

// schedule方法。 解释:1000ms是延迟启动时间;2000ms是定时任务周期,每2s执行一次
new Timer("testTimer").schedule(new TimerTask() {
                                                    @Override
                                                    public void run() {
                                                        System.out.println("TimerTask");
                                                    }
                                                }, 1000,2000);

 

// scheduleAtFixedRate方法。 date是开始时间,2000ms是定时任务周期,每2s执行一次
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
try {
    Date date = dateFormat.parse("2019-06-18 12:00:00.000");
    new Timer("testTimer1").scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            System.out.println("TimerTask");
        }
    }, date,2000);
} catch (ParseException e) {
    e.printStackTrace();
}

ScheduledExecutorService(线程池)

ScheduledExecutorService有三个常用方法:schedulescheduleAtFixedRatescheduleWithFixedDelay。直接上代码。

// schedule方法。 延迟1s启动,执行一次
scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("ScheduledTask");
            }
        },1, TimeUnit.SECONDS);
//scheduleAtFixedRate方法。 延迟1s启动,每隔2s执行一次。
//前一个任务开始时就计算时间间隔,但是会等上一个任务结束才开始下一个任务
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println("ScheduledTask");
    }
}, 1, 2, TimeUnit.SECONDS);
// scheduleWithFixedDelay方法。 延迟1s启动,在上一个任务执行完成之后&
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值