springboot scheduled线程池
时间: 2023-10-17 10:24:18 浏览: 90
在Spring Boot中,我们可以使用`@Scheduled`注解来实现定时任务。默认情况下,`@Scheduled`注解会创建一个单线程的线程池来执行定时任务。但是,当我们需要执行大量的定时任务时,单线程的线程池可能会成为瓶颈,导致任务执行时间过长。
为了解决这个问题,我们可以通过配置一个任务执行器来使用线程池执行定时任务。具体步骤如下:
1. 在`@Configuration`类中定义一个`TaskScheduler` bean,并配置线程池。
```java
@Configuration
@EnableScheduling
public class ScheduledConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
scheduler.setThreadNamePrefix("scheduled-thread-");
return scheduler;
}
}
```
2. 在定时任务的方法上添加`@Scheduled`注解,并指定`fixedDelay`或`cron`表达式。
```java
@Service
public class MyService {
@Scheduled(fixedDelay = 5000)
public void doSomething() {
// 执行定时任务
}
}
```
在上面的例子中,`fixedDelay`属性指定了任务的执行间隔为5秒。当我们启动应用程序时,Spring Boot将会自动创建一个线程池来执行所有的定时任务。
如果我们需要在应用程序关闭时关闭线程池,可以在`@Configuration`类中添加一个`@PreDestroy`方法来关闭线程池。
```java
@Configuration
@EnableScheduling
public class ScheduledConfig {
private final TaskScheduler taskScheduler;
public ScheduledConfig(TaskScheduler taskScheduler) {
this.taskScheduler = taskScheduler;
}
@PreDestroy
public void destroy() {
if (taskScheduler instanceof ThreadPoolTaskScheduler) {
((ThreadPoolTaskScheduler) taskScheduler).shutdown();
}
}
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
scheduler.setThreadNamePrefix("scheduled-thread-");
return scheduler;
}
}
```
在上面的例子中,我们通过`@PreDestroy`方法来关闭线程池。当应用程序关闭时,Spring Boot将会自动调用这个方法来关闭线程池。
阅读全文