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)


相关推荐

  • 2014 ACM省赛总结

    2014 ACM省赛总结

  • plsqldev8.0下载和注册码「建议收藏」

    plsqldev8.0下载和注册码「建议收藏」[b]关键词:PL/SQL,下载,plsqldev,注册码,plsqldev711,汉化文件[/b]PL/SQLDeveloper是一种集成的开发环境,专门用于开发、测试、调试和优化OraclePL/SQL存储程序单元,比如触发器等。PL/SQLDeveloper功能十分全面,大大缩短了程序员的开发周期。[url]http://www.kutoku.info/software…

  • stimulsoft mysql,将值传递给Stimulsoft报告参数「建议收藏」

    stimulsoft mysql,将值传递给Stimulsoft报告参数「建议收藏」HiIhaveareportinwindowsformapplicationthatit’sdesignedbyStimulsoftreportgenerator.MyreportgetdatafromMySQLdatabasebyastoredprocedure.MystoredprocedurehasaparameterasPer…

  • 挖矿程序的处理方式及步骤

    挖矿程序的处理方式及步骤概述随着币圈市场交易的活跃,币价也被日益推高。从BTC兑美元的在线交易平台上可以看出,BTC的价格屡创新高,这与MG的2W亿脱不了干系。“重赏之下,必有勇夫”,在互联网圈里也同样适用啊。所以服务器被植入挖矿程序已经不是很稀奇的事情了,很多服务器因为漏洞、弱密码、禁用防火墙等等举措,而被做了提权后,置入了挖矿程序。如果你接收到阿里云类似于挖矿程序的报警,那就不要慌。借用一句话就是:“遇事不要慌,先拍照,发个朋友圈”。挖矿程序的处理方式以下,简单地说一下遇到挖矿…

  • podman快速入门详解与实践

    podman快速入门详解与实践

  • 搭建pycharm环境_pycharm怎么配置anaconda环境

    搭建pycharm环境_pycharm怎么配置anaconda环境首先要创建一个项目,创建项目的同时,pycharm默认会顺带创建一个虚拟环境(如果你没修改默认配置的话)。点击终端,如果前面有个(venv)就是使用的虚拟环境了。接下来我们安装pyside6,在终端中输入并执行以下命令:pipinstallpyside6安装完成后配置拓展工具,需要用到的2个工具是pyside6-uic和pyside6-designerpyside6-designer是调用pyside6模块内附带的qtdesigner在Linux中其位

发表回复

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

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