Timer、ScheduledExecutor
# 1 Timer
在Jdk也为我们提供了任务调度相关支持,如Timer、ScheduledExecutor,下边我们了解下。
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("执行了任务.." + new Date());
}
}, 1000, 2000); //1秒后开始调度,每2秒执行一次
}
Timer 的优点在于简单易用,每个Timer对应一个线程,因此可以同时启动多个Timer并行执行多个任务,同一个Timer中的任务是串行执行。
# 2 ScheduledExecutor
ScheduledExecutorService
是一个接口,有多个实现类,比较常用的是ScheduledThreadPoolExecutor
,
Java 5 推出了基于线程池设计的 ScheduledExecutor,其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。
ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
service.scheduleAtFixedRate(new Runnable() {
@SneakyThrows
@Override
public void run() {
System.out.println("执行了任务1" + new Date());
}
}, 1, 5, TimeUnit.SECONDS);
# springTask
SpringTask是Spring自主研发的轻量级定时任务工具,相比于Quartz更加简单方便,且不需要引入其他依赖即可使用
# 启动SpringTask
在配置类中添加一个@EnableScheduling注解即可开启SpringTask的定时任务
@SpringBootApplication
//启用定时任务的配置
@EnableScheduling
public class SpringTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringTaskApplication.class);
}
}
# 创建任务类
我们直接通过 Spring 提供的
@Scheduled
注解即可定义定时任务,非常方便!
@Component
public class SpringTask {
@Scheduled(cron = "0/5 * * * * ?")
public void testTask() throws InterruptedException {
System.out.println("执行SpringTask任务,时间:" + LocalDateUtils.getLocalDateTimeStr());
}
}
# 支持Cron表达式
Spring Task 支持 Cron 表达式
Cron 表达式主要用于定时作业(定时任务)系统定义执行时间或执行频率的表达式,非常厉害,你可以通过 Cron 表达式进行设置定时任务每天或者每个月什么时候执行等等操作
推荐一个在线 Cron 表达式生成器:http://cron.qqe2.com/
# 优缺点
- 优点:简单,轻量,支持 Cron 表达式
- 缺点 :功能单一
# 总结:
Timer 和 ScheduledExecutor 都仅能提供基于开始时间与重复间隔的任务调度,不能胜任更加复杂的调度需求。 比如,设置每月第一天凌晨1点执行任务、复杂调度任务的管理、任务间传递数据等等。
上次更新: 2023/07/15, 02:20:43