我所了解的定时任务有以下几种:
使用线程/线程池创建定时任务
使用 Quartz 框架实现定时任务
spring中可以使用 @Scheduled 注解实现定时任务
使用线程/线程池创建定时任务
package com.example.ScheduledTask;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* Description: 线程定时任务 间隔时间执行
* date: <br/>
* @author: kk <br/>
* @since JDK 1.8
*/
public class Scheduled01 {
public static void main(String[] args) {
Runnable runnable=new Runnable() {
@Override
public void run() {
while (true){
try {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println( sdf.format(new Date()));
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
//方式一:线程休眠一定时间执行
//Thread thread=new Thread(runnable);
//thread.start();
//方式二:线程池间隔时间执行
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
//第二个参数:首次延迟时间 第三个参数:间隔时间 第四个参数:单位 秒,分,时,天
scheduledExecutorService.scheduleAtFixedRate(runnable,10,1, TimeUnit.SECONDS);
}
}
使用 Quartz 框架实现定时任务
package com.example.ScheduledTask;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import java.util.Date;
public class Scheduled03 {
public static void main(String[] args) throws SchedulerException {
//1.创建Scheduler的工厂
SchedulerFactory sf = new StdSchedulerFactory();
//2.从工厂中获取调度器实例
Scheduler scheduler = sf.getScheduler();
//3.创建JobDetail,
JobDetail jb = JobBuilder.newJob(MySelfJob.class)
//job的描述
.withDescription("继承job重写方法")
//job 的name和group
.withIdentity("myselfJob", "myselfJobGroup")
.build();
//任务运行的时间,SimpleSchedle类型触发器有效,3秒后启动任务
long time = System.currentTimeMillis() + 3 * 1000L;
Date statTime = new Date(time);
//4.创建Trigger
//使用SimpleScheduleBuilder或者CronScheduleBuilder
Trigger t = TriggerBuilder.newTrigger()
.withDescription("")
.withIdentity("myselfJobTrigger", "myselfJobTriggerGroup")
//.withSchedule(SimpleScheduleBuilder.simpleSchedule())
//默认当前时间启动
.startAt(statTime)
//10秒执行一次,Quartz表达式,支持各种牛逼表达式
.withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?"))
.build();
//5.注册任务和定时器
scheduler.scheduleJob(jb, t);
//6.启动 调度器
scheduler.start();
}
}
package com.example.ScheduledTask;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
/**
* 继承Quartz框架中的Job,并重写execute方法
*/
public class MySelfJob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("当前时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis()));
}
}
spring中可以使用 @Scheduled 注解实现定时任务
package com.example.ScheduledTask;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import java.text.SimpleDateFormat;
/**
@EnableScheduling 开启对定时任务的支持
*/
@SpringBootApplication //主程序启动类
@EnableScheduling //开启对定时任务的支持
@Configuration // 这里使用@Component也行
public class Scheduled02 {
// 5s执行一次 5min 20点执行
@Scheduled(fixedRate = 5* 1 * 1000)
//@Scheduled(fixedRate = 5* 60 * 1000)
//@Scheduled(cron="0 0 20 * * ? *")
private void updateTask() {
System.out.println("通过注解@Scheduled实现定时任务 定时任务开始执行-------------------");
System.out.println("当前时间=="+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis()));
}
public static void main(String[] args) {
SpringApplication.run(Scheduled02.class, args);
}
}