栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot实现异步调用功能

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot实现异步调用功能

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 +
                "rn所用时间: " + (endTime-startTime) + "ms";
        System.out.println(result);

        return result;
    }
}

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

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/349257.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号