1.时间固定的定时任务
使用Spring框架中用于定时任务的注解@Scheduled
@Scheduled(cron = "0 0 12,23 * * ? ")
上方的代码表示任务将在每天的中午12点和晚上11点执行
在cron表达式中,不同位置的参数分别代表不同的含义:
- 第一位:秒(0-59)
- 第二位:分钟(0-59)
- 第三位:小时(0-23)
- 第四位:日期(1-31)
- 第五位:月份(1-12)
- 第六位:星期几(0-7,0和7都表示星期日)
- 第七位:年份(可选,留空表示任意年份)
该方法适用于已知的固定时间执行任务。
2.时间在变的定时任务
当我们需要在指定时间执行任务时,但是时间并不固定,此时需要创建一个定时器执行池。
//定时任务,创建固定大小为2的线程池
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
//计算当前时间距离指定时间的时间间隔(当前时间距离10:30的时间间隔)
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);
Date fiveAM = calendar.getTime();
long time = fiveAM.getTime() - System.currentTimeMillis();
// 如果当前时间已经过了10:30,则设置为明天的10:30执行任务
if (time < 0) {
time += 24 * 60 * 60 * 1000;
}
//安排一个任务在指定的延迟时间后执行
heduledFuture<?> future1 = scheduler.schedule(task1, time , TimeUnit.MILLISECONDS);
//任务
Runnable task1 = () -> {
//代码逻辑
};
//关闭线程池
scheduler.shutdownNow();
TimeUnit.MILLISECONDS表示initialDelay的时间单位是毫秒,可以根据需要选择适当的时间单位来表示延迟时间或执行间隔时间
TimeUnit.NANOSECONDS:纳秒TimeUnit.MICROSECONDS:微秒TimeUnit.MILLISECONDS:毫秒TimeUnit.SECONDS:秒TimeUnit.MINUTES:分钟TimeUnit.HOURS:小时TimeUnit.DAYS:天
需要在设定一个时间执行任务后多次执行时,可以使用scheduleAtFixedRate方法
该方法第三个参数就是下次执行任务的时间间隔,以下代码表示在第一次执行完后第二天的同样时间继续执行该任务
scheduler.scheduleAtFixedRate(task1, time, 24 * 60 * 60 * 1000, TimeUnit.MILLISECONDS);
需要取消任务时
future1.cancel(true);
- 当参数为
true时,表示尝试取消任务执行。如果任务尚未开始,则任务将不会运行。如果任务已经开始,则尝试中断任务的执行。 - 当参数为
false时,表示尝试取消任务执行。如果任务尚未开始,则任务将不会运行。如果任务已经开始,则不会尝试中断任务的执行。

204

被折叠的 条评论
为什么被折叠?



