定时任务

本文详细介绍了如何在Java中实现定时任务,包括使用TimerTask的步骤和注意事项,以及如何通过Calendar对象替代过时的Date方法。此外,还探讨了Quartz框架的使用,包括JobDetail配置和Cron表达式的解析,帮助开发者理解和实现定时任务的高级功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一篇关于如何编码使程序在特定时间启动,并以一定时间间隔为单位多次启动的Blog。

一、使用TimerTasker

		TimerTask timerTask = new TimerTask() {

			@Override
			public void run() {
				try {
					// 添加需要调用的方法
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		};                                           

上面是所要完成的程序的主体,接下来配置定时任务的执行时间。

下图实例表示第一次启动是在2018年6月1日早上10点整,每隔24小时执行一次。

new Timer().schedule(timerTask, new Date(118, 5, 1, 10, 0, 0), 24 * 60 * 60 * 1000);

注意schedule(TimerTask, Long, Long)中第二个参数我们使用了Date对象。该对象采用(year, month, date, hourOfDay, minute, second)的形式。需要注意两点,年这一传参应该是减掉1900之后的数字,月这一传参是0-based的。第三个参数的单位是毫秒,所以如果想表示成秒不要忘记乘以1000.

不过Date这个方式eclipse一直提示deprecated,不建议再使用。所以有另一种替换方式,使用Calendar对象。注意我们自己是不能创建Calendar对象的,必须使用getInstance()方法。月这一传参还是0-based的。下图实例仍然表示第一次启动是在2018年6月1日早上10点整,每隔24小时执行一次。

    Calendar calendar = Calendar.getInstance();
    calendar.set(2018, 5, 1, 10, 0, 0);
    new Timer().schedule(timerTask, calendar.getTime(), 24 * 60 * 60 * 1000);

二、使用Quartz框架

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;


public class QuartzCronTiggerJobTest {

	public static void main(String[] args) {

		try {
			// 得到默认的调度器
			Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

			// 定义当前调度器的具体作业对象
			JobDetail jobDetail = JobBuilder.newJob((Class<? extends org.quartz.Job>) TestJob.class)
					.withIdentity("cronTriggerDetail", "cronTriggerDetailGrounp").build();
			// 定义当前具体作业对象的参数
			JobDataMap jobDataMap = jobDetail.getJobDataMap();
			jobDataMap.put("name", "cronTriggerMap");
			jobDataMap.put("group", "cronTriggerGrounp");

			// 作业的触发器
			// 在任务调度器中,使用任务调度器的 CronScheduleBuilder 来生成一个具体的 CronTrigger 对象
			CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("cronTrigger", "cronTrigger")
					.withSchedule(CronScheduleBuilder.cronSchedule("0 0 10 * * ? 2018")).build();
			
			// 注册作业和触发器
			scheduler.scheduleJob(jobDetail, cronTrigger);

			// 开始调度任务
			scheduler.start();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
}

在JobDetail语句中定义想要被触发的类的名字,在本例中为TestJob.class,已标红。

下面是TestJob.class的配置,将任务放在execute()方法之中。

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TestJob implements Job{

	public void execute(JobExecutionContext jobContext) throws JobExecutionException {
                //需要被重复调度的任务
        }
}

Cron表达式是以5个或者6个空格隔开,分成6个或7个域,每个域代表一个时间域。Cron表达式有以下两种语法格式:

1.     Seconds Minutes Hours DayofMonth Month DayofWeek Year

2.     Seconds Minutes Hours DayofMonth Month DayofWeek

 * :表示匹配任意值。比如在Seconds域中配置为*,则表示每秒执行。(可用于任意域)

?:只能用在 DayofMonth和DayofWeek,表示匹配该域的任意值。

注意DayofMonth和DayofWeek不能同时出现限定值,其中之一必须以?表示,否则机器无法确认你的意图。





版权声明:本文为博主原创文章,未经博主允许不得转载https://mp.youkuaiyun.com/postedit/80743456

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值