Spring Boot 中的异步调用[通俗易懂]

Spring Boot 中的异步调用[通俗易懂]SpringBoot中的异步调用通常我们开发的程序都是同步调用的,即程序按照代码的顺序一行一行的逐步往下执行,每一行代码都必须等待上一行代码执行完毕才能开始执行。而异步编程则没有这个限制,代码的调用不再是阻塞的。所以在一些情景下,通过异步编程可以提高效率,提升接口的吞吐量。这节将介绍如何在SpringBoot中进行异步编程。要开启异步支持,首先得在SpringBoot入口类上加上@EnableAsync注解:@SpringBootApplication@EnableAsyncpublic

大家好,又见面了,我是你们的朋友全栈君。

Spring Boot 中的异步调用

通常我们开发的程序都是同步调用的,即程序按照代码的顺序一行一行的逐步往下执行,每一行代码都必须等待上一行代码执行完毕才能开始执行。而异步编程则没有这个限制,代码的调用不再是阻塞的。所以在一些情景下,通过异步编程可以提高效率,提升接口的吞吐量。这节将介绍如何在Spring Boot中进行异步编程。
要开启异步支持,首先得在Spring Boot入口类上加上@EnableAsync注解:
@SpringBootApplication
@EnableAsync
public class DemoApplication { 
   
    public static void main(String[] args) { 
   
        SpringApplication.run(DemoApplication.class, args);
    }
}
新建service包,并创建TestService:
@Service
public class TestService { 
   

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Async
    public void asyncMethod() { 
   
        sleep();
        logger.info("异步方法内部线程名称:{}", Thread.currentThread().getName());
    }

    public void syncMethod() { 
   
        sleep();
    }

    private void sleep() { 
   
        try { 
   
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) { 
   
            e.printStackTrace();
        }
    }
}
上面的Service中包含一个异步方法asyncMethod(开启异步支持后,只需要在方法上加上@Async注解便是异步方法了)和同步方法syncMethod。sleep方法用于让当前线程阻塞2秒钟。
因为异步的原因,程序并没有被sleep方法阻塞,这就是异步调用的好处。同时异步方法内部会新启一个线程来执行
默认情况下的异步线程池配置使得线程不能被重用,每次调用异步方法都会新建一个线程,我们可以自己定义异步线程池来优化。
@Configuration
public class AsyncPoolConfig { 
   

    @Bean
    public ThreadPoolTaskExecutor asyncThreadPoolTaskExecutor(){ 
   
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(200);
        executor.setQueueCapacity(25);
        executor.setKeepAliveSeconds(200);
        executor.setThreadNamePrefix("asyncThread");
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(60);

        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        executor.initialize();
        return executor;
    }
}
要使用该线程池,只需要在@Async注解上指定线程池Bean名称即可:
@Service
public class TestService { 
   
    ......

    @Async("asyncThreadPoolTaskExecutor")
    public void asyncMethod() { 
   
       ......
    }
    ......
}

处理异步回调

如果异步方法具有返回值的话,需要使用Future来接收回调值。我们修改TestService的asyncMethod方法,给其添加返回值:
@Async("asyncThreadPoolTaskExecutor")
public Future<String> asyncMethod() { 
   
    sleep();
    logger.info("异步方法内部线程名称:{}", Thread.currentThread().getName());
    return new AsyncResult<>("hello async");
}
Future接口的get方法用于获取异步调用的返回值。
通过返回结果我们可以看出Future的get方法为阻塞方法,只有当异步方法返回内容了,程序才会继续往下执行。get还有一个get(long timeout, TimeUnit unit)重载方法,我们可以通过这个重载方法设置超时时间,即异步方法在设定时间内没有返回值的话,直接抛出java.util.concurrent.TimeoutException异常。
比如设置超时时间为60秒:
String result = stringFuture.get(60, TimeUnit.SECONDS);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157342.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 简单无序列表_无序列表怎么横排

    简单无序列表_无序列表怎么横排实现如下图所示的简单无序列表,并为每个列表项添加超链接。每个列表项的宽度为50px,高度为30px,列表中的文字在水平和垂直方向上均居中显示,超链接初始状态和访问后的状态均为黑色无下划线,鼠标经过和点

  • Skype for Business Server 2015-04-前端服务器-6-设计拓扑

    Skype for Business Server 2015-04-前端服务器-6-设计拓扑

  • Anaconda 的安装教程(图文)「建议收藏」

    Anaconda的介绍Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda的下载文件比较大。这么说可能有点抽象,大家可以直接把Anaconda理解为一个python的傻瓜捆绑包就行了Anaconda下载下载地址:https://www.anaconda.com/download/…

  • webpack开发环境和生产环境_webpack开发环境和生产环境

    webpack开发环境和生产环境_webpack开发环境和生产环境前言如果我们需要使用webpack,就需要依赖node环境nvmnodenpmwebpack@cliwebpacknvm安装nvm是一个用来管理node版本的工具。我们之所以需要使用n

  • linux基础50——ldd

    linux基础50——ldd1.概念ldd命令用于打印程序或者共享库文件所依赖的共享库列表。注意,ldd本身不是一个二进制程序,而是一个Shell脚本,使用文本编辑器vim可以查看其内容,具体目录可以使用which命令查看:[root@192pthread]#whichldd/usr/bin/ldd我们知道,Linux的动态库装载器ld-linux.so模块会先于executable模块工作,并获得控制权,ld-linux.so会通过系统环境变量的设置,选择只显示可执行模块的d

  • Eigen库在VS2017下的配置与使用

    Eigen库在VS2017下的配置与使用参考:Eigen的简介和下载安装https://www.cnblogs.com/goingupeveryday/p/5699053.htmlC++矩阵处理工具——Eigenhttps://blog.csdn.net/abcjennifer/article/details/7781936C++开源矩阵计算工具——Eigen在VS2005中的下载、配置与使用…

    2022年10月10日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号