首先需要在pom文件中应用定时执行任务包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
具体的定时任务实现方式
1.首先创建需要定时执行的任务testJob,实现一个类继承job类
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by root on 2018/5/7.
*/
public class testJob implements Job {
private static Logger logger = LoggerFactory.getLogger(testJob.class);
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
logger.info("这是一个定时任务,启动时间为"+System.currentTimeMillis());
}
}
2.指定具体执行时间
//创建任务通道
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler()
//加载需要执行的JOB
JobDetail jobByDay = newJob(testJob.class).withIdentity("myjob", Scheduler.DEFAULT_GROUP).build();
//设置执行时间,该例子中是让程序每天凌晨个00:00:00执行testJob
CronTrigger triggerByDay = newTrigger().withIdentity("trigger_ByDay", Scheduler.DEFAULT_GROUP).withSchedule(cronSchedule("0 0 0 * * ?")).build();
3.指定的执行时间是在cronSchedule()中进行配置,配置的格式为
Seconds Minutes Hours DayofMonth Month DayofWeek Year或
Seconds Minutes Hours DayofMonth Month DayofWeek
需要注意的点是
1.设置年的参数可以省略
2.DayofMonth配置的是,在每月的几号执行
DayofWeek 配置的是,在每月的周几执行
所以这两个参数基本是互斥的,不允许同时配置,当配置其中一项是,另外一项需要赋值?问号。所以认为必定存在一个问号?。例如
0 0 2 1 * ? 在每月的1日的凌晨2点执行调度任务
时间段的设置形式为x-y,例如
0 0 2 1-4 * ?在每月的1~4号凌晨2点执行调度任务
多个时间点的设置形式为x,y,z例如
0 0 10,14,16 ? * 2 在每个星期一上午10点,下午2点,4点 执行调度任务
基础的时间格式上述足够使用,如果需要更复杂的介绍,请查看
https://www.cnblogs.com/linjiqin/archive/2013/07/08/3178452.html
还有一种方式是使用Executors创建一个定时任务线程池 newScheduledThreadPool
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3,
new ThreadFactoryBuilder()
.setNameFormat("Myscheduledtheeed-%d")
.setDaemon(true)
.build());
int start_time=1;//指定任务设置之后多长之后开始执行
int cycles_time=2; //指定每隔多长时间,在执行一次任务
TimeUnit unit =TimeUnit.DAYS; //指定上面两个参数的时间单位
scheduler .scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// do you work
}
}start_time,cycles_time,unit);
int start_time2=1;//指定任务设置之后多长之后开始执行
int cycles_time2=2; //指定每隔多长时间,在执行一次任务
TimeUnit unit =TimeUnit.DAYS; //指定上面两个参数的时间单位
//与上面不同的是,循环时间会依据执行任务时间推迟 ,所有每次的任务启动时间间隔为————>任务执行时间+cycles_time2
scheduler .scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
// do you work
}
}start_time,cycles_time,unit);