最近在做项目的时候遇到一个需求会用到定时任务,所以简单整理了一下定时执行某个任务的几种方式:
简单举几个栗子吧…
1. Timer类实现的三种方式
/**
* 设定2000毫秒后执行
*/
public static void timer01(){
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.err.println("------定时执行的任务------");
}
}, 2000);
}
/**
* 延时2秒后,隔5秒执行一次
*/
public static void timer02(){
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.err.println("------定时执行的任务------");
}
}, 2000, 5000);
}
/**
* 指定时间执行。
*/
public static void timer03(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 17); // 17:56分执行
calendar.set(Calendar.MINUTE, 56);
calendar.set(Calendar.SECOND, 0);
Date date = calendar.getTime();
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.err.println("------定时执行的任务------");
}
}, date, 1000 * 60 * 60 * 24);
}
2. 通过JDK自带的ScheduledExecutorService类实现定时任务
/**
* @author Jack.Hu
*/
public class TaskTest {
public static void main(String[] args) {
ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
/**
* 参数:任务体,第一次执行等待的时间,隔几秒执行,时间单位
*/
scheduledExecutor.scheduleAtFixedRate(() -> task(), 2, 3, TimeUnit.SECONDS);
}
public static void task() {
String dateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.out.println("执行任务的时间:" + dateTime);
}
}
3. 使用SpringTask实现定时任务
配置线程池:如果只有一个定时任务则不用配置线程
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class SpringTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringTaskApplication.class, args);
}
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
taskScheduler.setThreadNamePrefix("zhiYouWo-task");
taskScheduler.initialize();
return taskScheduler;
}
}
创建定时任务类
/**
* @author Jack.Hu
*/
@Component
@Async // 每个任务一个线程
public class TaskTest {
/**
* cron表达式:2秒执行一次
*/
@Scheduled(cron = "0/2 * * * * ?")
public void task01() {
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.err.println("线程:" + Thread.currentThread().getName() + "正在执行,执行时间:" + date);
}
/**
* 上一次任务执行完的时间点之后5秒再执行
*/
@Scheduled(fixedDelay = 5000)
public void task02() {
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.err.println("线程:" + Thread.currentThread().getName() + "正在执行,执行时间:" + date);
}
/**
* 上一次任务开始时间点之后5秒再执行
*/
@Scheduled(fixedRate = 5000)
public void task03() {
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.err.println("线程:" + Thread.currentThread().getName() + "正在执行,执行时间:" + date);
}
/**
* 第一次2秒后执行,后面每5秒执行一次
*/
@Scheduled(initialDelay = 1000, fixedDelay = 5000)
public void task04() {
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.err.println("线程:" + Thread.currentThread().getName() + "正在执行,执行时间:" + date);
}
}
任务执行中。控制台显示如下
4. 使用Quartz调度器
Quartz配置类
/**
* @author Jack.Hu
*/
@Configuration
public class QuartzConfig {
@Bean
public JobDetail teatQuartzDetail() {
return JobBuilder.newJob(QuartzTest.class).withIdentity("quartzTest").storeDurably().build();
}
@Bean
public Trigger testQuartzTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2) // 隔多久执行一次
.repeatForever();
SimpleTrigger quartzTest = TriggerBuilder.newTrigger().forJob(teatQuartzDetail())
.withIdentity("quartzTest")
.withSchedule(scheduleBuilder)
.build();
return quartzTest;
}
}
定时任务类
/**
* @author Jack.Hu
*/
public class QuartzTest extends QuartzJobBean {
/**
* 定时任务(业务逻辑)
*/
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.err.println(Thread.currentThread().getName() + ", 定时任务执行的时间:" + date);
}
}
以上文章有什么不对的地方,望大佬们不吝赐教!