首页 > 其他分享 >spring boot @ansy 底层异步线程原理代码简要说明及代码示例

spring boot @ansy 底层异步线程原理代码简要说明及代码示例

时间:2024-12-29 19:28:00浏览次数:3  
标签:ansy 异步 代码 示例 springframework import org public Async

在 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

相关文章