spring中的@Async @EnableAsync注解及线程池-程序员宅基地

技术标签: spring  java  后端  

spring对多线程做了很好的支持.主要有@Async @EnableAsync注解.

@Async.直接加在方法上,调用该方法时会自动创建一个线程.线程池默认使用SimpleAsyncTaskExecutor.不重用线程,每次调用都会创建一个新的线程.所以单单使用@Async可能会产生并发问题.需要自定义线程池.使用@Async有以下几个注意事项:

1.要异步执行的方法加上@Async

2.调用异步方法需要配置上注解@EnableAsync.可以在spring入口类加注解,也可以在需要调用异步方法的类上注解也可以直接在配置类加.

3.异步方法不能和调用方法放在一个类里面,必须不同类间调用,所以,很显然异步方法都是public.

4. 在@Async标注的方法,同时也适用了@Transactional进行了标注的情况;在其调用数据库操作之时,将无法产生事务管理的控制,原因就在于其是基于异步处理的操作。 那该如何给这些操作添加事务管理呢?可以将需要事务管理操作的方法放置到异步方法内部,在内部被调用的方法上添加@Transactional.

5.不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor.SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。并发大的时候会产生严重的性能问题.

6.@Async注解一般用在类的方法上,如果用在类上,那么这个类所有的方法都是异步执行的;

7.返回值:需要返回值用AsyncResult或者CompletableFuture

8.@Async默认使用Bean Name为executor的线程池。也可以根据Bean Name指定特定线程池.

9.线程池:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。spring中可以写一个线程池的配置类交给spring管理.为了提高项目的健壮性,不同业务配置不同线程池.

@Bean
    public Executor asyncServiceExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //ThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor();

        //配置核心线程数,线程池维护线程的最少数量
        executor.setCorePoolSize(5);

        //配置最大线程数,线程池维护线程的最大数量
        executor.setMaxPoolSize(5);

        //配置队列大小,缓存队列
        executor.setQueueCapacity(99999);

        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("async-service-");

        // rejection-policy:当pool已经达到max size的时候,如何处理新任务

        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行

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

        //允许的空闲时间 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
        //executor.setKeepAliveSeconds(1);

        //执行初始化
        executor.initialize();

        return executor;

    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hongsedezise/article/details/125282143

智能推荐

CVPR 2019 IIAI 目标计数-程序员宅基地

文章浏览阅读1k次。点击我爱计算机视觉标星,更快获取CVML新技术本文来自起源人工智能研究院(IIAI)。本期以Object Counting为主题,简要介绍IIAI CVPR 2019录用论文中关于Cou..._crowd counting and density estimation by trellis encoder-decoder networks

VScode配置latex时 出现 “Cannot find LaTeX root file”且文本无高亮提示,不显示tex图标_cannot find latex root file.-程序员宅基地

文章浏览阅读1.5w次。如图所示:起初以为是set json里面没有配置好,最后折腾了半天才发现没有选择语言模块(右下角select language module)解决方法:右下角点击JSON,搜索latex,选中即可用VScode+latex时遇到很多坑,其实不必要配置set json,网上的很多配置方案已经很老了。直接安装vscode的插件latex workship即可。要是有同学需要我可以出一个VCcode+latex配置过程。..._cannot find latex root file.

【面向对象】5.语句_面向对象语句-程序员宅基地

文章浏览阅读64次。语句简单语句语法上需要一条语句,逻辑上不需要时,使用空语句应该加上注释,从而让读代码的人知道这条语句是有意省略的多余的空语句并非总是无害的,可能导致死循环语法上需要一条语句,逻辑上需要多条语句,则应使用复合语句空块:内部没有任何语句的一对花括号,等价于空语句while (i <= 10)ans += i, ++i;可以用逗号替代,但是代码的可读性降低条件语句if后的条件一定要用括号括起来case关键字 后面的值一定要是整型常量表达式,break_面向对象语句

mysql--存储过程和函数_mysql 存储过程定义了参数不使用 会影响结果吗-程序员宅基地

文章浏览阅读267次。一、什么是存储过程和函数存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。存储过程和函数的区别在于函数必须要有返回值,而存储过程没有,存储过程的参数可以使用IN、OUT、INOUT类型(其中OUT和INOUT类型的参数可充当返回值),而函数的参数只能是IN类型的。如果有函数从其他类型的数据库迁移到MYSQL,那么就可能因此需要将函数改造成存储过程。二、创建_mysql 存储过程定义了参数不使用 会影响结果吗

<ul>和<li>标签的作用_<ul><li>-程序员宅基地

文章浏览阅读2k次。如果用于DIV+CSS布局的话,ul+li可以替换表格的作用,具体的设置,如果宽度高度、行间距、背景边框等需要配合CSS一起设置。普通的显示数据的时候,ul就是项目列表,li就是列表项。_

【Java程序设计】【C00799】基于(JavaWeb)Springboot的善筹网(众筹)管理系统(含论文+PPT)-程序员宅基地

文章浏览阅读388次,点赞5次,收藏3次。运行环境:推荐jdk1.8;开发工具:eclipse以及idea(推荐)、maven;操作系统:windows 10 8G内存以上(其他windows以及macOS支持,但不推荐);浏览器:Firefox(推荐)、Google Chrome(推荐)、Edge;数据库:MySQL8.0(推荐)及其他版本(支持,但容易异常尤其MySQL5.7(不含)以下版本);数据库可视化工具:Navicat Premium 15(推荐)以及其他Navicat版本是否maven项目:是。

随便推点

虚幻4调试模式和关于虚幻引擎4.18和4.19源码版,无法使用DebuggameEditor调试模式的解决方法。_虚幻4清除调试-程序员宅基地

文章浏览阅读6.9k次。最近用vs2017最新版的时候发现UE4.18和4.19preview会有一个问题,那就是在developmentEditor模式下调试,断点会飘。明明下了断点的地方直接跳过去了。于是去查了一下文档:在Release模式下,代码会进行优化。所以很多调试符号都没有了。DevelopmentEditor其实还是Release模式。解决这个问题有两个办法,第一个就是手动关闭release模式的优_虚幻4清除调试

TCPIP协议详解-程序员宅基地

文章浏览阅读9.5w次,点赞113次,收藏948次。本博客整理自网络,仅供学习参考,如有侵权,联系删除。邮箱:[email protected]。协议分层TCP/IP在数据包设计上采用封装和分用的策略,所谓封装就是在应用程序在发送数据的过程中,每一层都增加一些首部信息,这些信息用于和接收端同层次进行沟通,例如当数据从应用程序发送到以太网过程中数据逐层加工的示意图如下所示:1.应用层应用层做为 TCP/IP 协议的最高层..._tcpip协议

java 按月分组_android日历选择按月分组并用recyclerview展示-程序员宅基地

文章浏览阅读163次。今天分享一个日历选择控件,可以定义日期可选、选择范围、按月分组展示。这个日历无非就是把每个日期的数据通过系统的日历查询出来,然后用recyclerview展示即可,数据模型里可以定义哪些可选以及选定状态等等。思路就是这样了,先看看效果:日历效果首先定义好数据来源,即从系统的calendar获取日期列表,这里因为是要按月分组,所以我选择用一个key为月份的时间戳value为对应月份的所有日期list..._java获取当前时间每一个月份的数据并按照月份分组

ios Objective-c 横向UIScrollView和内部的UITableView滑动冲突(必须先下滑才能向上滑动)_object-c uicollectionview 嵌套 uicollectionview 滚动冲突-程序员宅基地

文章浏览阅读535次。问题:在UIScrollView内的UITableView必须先下滑才能向上滑动解决办法:自定义一个类继承UIScrollView,内部重写gestureRecognizerShouldBegin方法- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ UIPanGestureRe..._object-c uicollectionview 嵌套 uicollectionview 滚动冲突

幂等性问题与解决方案-程序员宅基地

文章浏览阅读401次。幂等概念来自数学,表示N次变换和1次变换的结果是相同的。这里讨论在某些场景下,客户端在调用服务没有达到预期结果时,会进行多次调用,为避免多次重复的调用对服务资源产生副作用,服务提供者会承诺满足幂等。HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的副作用(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。幂等多次请求对资源没有副作用(比如查询数据库操作,没有增删改,因此没有对数据库有任何影响)。_幂等性问题

零基础到GPT高手:快速学习与利用ChatGPT的完全指南_chatgpt从入门到精通-程序员宅基地

文章浏览阅读572次,点赞5次,收藏5次。进入人工智能时代,令人惊叹的ChatGPT技术正在引爆全球!!!您是否想象过能够与智能语言模型对话,提升工作效率、解锁创意,甚至实现商业化变现?在本篇文章中,我将向你揭示ChatGPT的原理、学习技巧,并展示如何利用ChatGPT提升工作效率和实现商业变现。无论是初学者还是有经验的开发者,都将为你提供宝贵的信息和资源,助你成为一名ChatGPT高手。一起探索ChatGPT的魅力,让ChatGPT成为技能发展和事业成功的引擎!_chatgpt从入门到精通

推荐文章

热门文章

相关标签