定时任务执行(Java)

该文章已生成可运行项目,

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时,表示尝试取消任务执行。如果任务尚未开始,则任务将不会运行。如果任务已经开始,则不会尝试中断任务的执行。
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的噗噗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值