在 Spring Boot 中,使用@Async注解可以非常方便地实现方法的异步调用。其底层是基于 Spring 的TaskExecutor实现的。以下是@Async异步线程原理的简要说明及代码示例。
原理
1. 注解声明:在需要异步执行的方法上使用@Async注解。
2. 配置启用:在主类或配置类上启用异步支持,通过添加@EnableAsync注解。
3. 线程池管理:Spring 会默认使用SimpleAsyncTaskExecutor作为线程池,但通常我们会配置一个自定义的TaskExecutor(如ThreadPoolTaskExecutor)来管理线程。
4. 代理机制:Spring 使用 AOP(面向切面编程)代理来拦截被@Async注解的方法,并在单独的线程中执行。
代码示例
1. 引入依赖:确保在pom.xml中引入了 Spring Boot Starter AOP 依赖(通常 Spring Boot Starter 包含了 AOP 依赖)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 启用异步支持:在主类或配置类上添加@EnableAsync注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
public class AsyncApplication {
public static void main(String[] args) {
SpringApplication.run(AsyncApplication.class, args);
}
}
3. 配置自定义线程池:在配置类中定义一个TaskExecutorbean。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
public class AsyncConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
executor.setThreadNamePrefix("AsyncExecutor-");
executor.initialize();
return executor;
}
}
4. 使用@Async注解:在需要异步执行的方法上添加@Async注解。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncService {
@Async("taskExecutor")
public void executeAsyncTask() {
System.out.println("运行异步任务" + Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("运行异步任务" + Thread.currentThread().getName());
}
}
5. 调用异步方法:从控制器或其他服务中调用异步方法。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AsyncController {
@Autowired
private AsyncService asyncService;
@GetMapping("/async")
public String triggerAsyncTask() {
asyncService.executeAsyncTask();
return "异步任务";
}
}
注意事项
• 确保异步方法所在的类被 Spring 管理(如使用@Service注解)。
• 异步方法不能是同一个类内部的调用,因为 Spring AOP 代理仅对外部调用生效。
• 可以通过返回Future<T>或CompletableFuture<T>来获取异步方法的执行结果。
标签:ansy,异步,代码,示例,springframework,import,org,public,Async From: https://blog.csdn.net/qq_44378083/article/details/144751381