SpringBoot实现异步调用功能

本文介绍了SpringBoot如何利用异步调用来优化系统性能,通过@EnableAsync注解启动异步功能,并配置线程池。在示例中展示了如何在方法上添加@Async注解实现异步执行,以及在实际业务场景中如何应用,以减少响应时间,处理耗时任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot的异步调用功能可以先释放容器分配给请求的线程与相关资源,减轻系统负担,提高响应效率,下图为在一种业务场景下的原理图

 此功能为springboot自带,在启动类添加@EnableAsync注解

@EnableAsync
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

 异步调用是会从线程池中获取线程,所以需要配置线程池

@Configuration
public class Config {
    private static final int MAX_POOL_SIZE = 50;

    private static final int CORE_POOL_SIZE = 20;

    @Bean("asyncTaskExecutor")
    public AsyncTaskExecutor asyncTaskExecutor() {
        ThreadPoolTaskExecutor asyncTaskExecutor = new ThreadPoolTaskExecutor();
        asyncTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        asyncTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        asyncTaskExecutor.setThreadNamePrefix("异步线程-");
        asyncTaskExecutor.initialize();
        return asyncTaskExecutor;
    }
}

使用时,只需要在方法上添加@Async注解即可,名称可填可不填,它会自动去线程池中获取线程

@Override
    @Async("asyncTaskExecutor")
    public String asynchronousMethod() {
        try {
            //让程序睡10s钟
            Thread.sleep(10000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程名称 :" + Thread.currentThread().getName());
        return "异步调用结束";
    }

    @Override
    public String synchronizationMethod() {
        System.out.println("线程名称 :" + Thread.currentThread().getName());
        return "同步方法调用结束";
    }
@RestController
public class AsynchronousDemoController {

    @Autowired
    private AsynchronousDemoService asynchronousDemoService;


    @GetMapping("/demo/1")
    public String demo() {
        //开始时间
        long startTime = System.currentTimeMillis();
        
        //给当前线程起一个名字
        Thread.currentThread().setName("同步线程");
        //调用异步方法
        String asynchronous = asynchronousDemoService.asynchronousMethod();
        //调用同步方法
        String synchronization = asynchronousDemoService.synchronizationMethod();
        
        //结束时间
        long endTime = System.currentTimeMillis();

        String result = "异步结果: " + asynchronous + ":::::::::::" + "同步结果: " + 
        synchronization +
                "\r\n所用时间: " + (endTime-startTime) + "ms";
        System.out.println(result);

        return result;
    }
}

测试结果:可以看到异步线程是在此次请求结束后才执行完的,所以我们可以用它来处理一些耗时的业务,例如复杂的计算,循环判断等等,可以让前端更快的得到响应.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值