java异步编程的四种方法 (java异步注解@Async)
Java要,可以提高面将详细介绍Java中四种用的异步编程方法,其中包括使用Java异步注解@Async。
1. 使用线程池
在Java中,可以通过线程池来实现异步编程。线程池可以重用线程,避免线程创建和销毁的开销。通过Executor框架,可以方便地创建线程池,并通过submit()方法提交异步任务。
2. 使用Future和Callable
Future和Callable是Java中用于异步编程的关键类。Callable接口类似于Runnable接口,但是可以返回结果或抛出异常。Future可以异步获取Callable的结果,通过isDone()方法判断任务是否完成,get()方法获取结果。
3. 使用CompletableFuture
CompletableFuture是Java 8中引入的用于异步编程的类。它可以在异步任务完成时触发回调函数,也可以通过thenCompose()方法组合多个CompletableFuture。CompletableFuture提供了丰富的,可以实现复杂的异步编程逻辑。
4. 使用Java异步注解@Async
Spring框架提供了@Async注解,可以方便地实现异步方法调用。只需要在方法上加上@Async注解,Spring会自动创建代理对象,将方法调用转换为异步调用。@Async注解还支持指定线程池,可以更灵活地控制异步任务的执行。
Spring Boot中异步线程池@Async详解
1、消息队列MQ
2、线程池处理。
我们来看看Spring框架中如何去使用线程池来完成异步操作,以及分析背后的原理。
在Spring4中,Spring中引入了一个新的注解@Async,这个注解让我们在使用Spring完成异步操作变得非常方便。
Spring异步线程池的接口类,其实质是
Spring 已经实现的异常线程池:
Spring中用@Async注解标记的方法,称为异步方法。在spring boot应用中使用@Async很简单:
1、调用异步方法类上或者启动类加上注解@EnableAsync
2、在需要被异步调用的方法外加上@Async
3、所使用的@Async注解方法的类对象应该是Spring容器管理的bean对象;
启动类加上注解@EnableAsync:
在需要被异步调用的方法外加上@Async,同时类AsyncService加上注解@Service或者@Component,使其对象成为Spring容器管理的bean对象;
这里需要注意的是:
1、同一个类里面调用异步方法不生效:原因默认类内的方法调用不会被aop拦截,即调用方和被调用方是在同一个类中,是无法产生切面的,该对象没有被Spring容器管理。即@Async方法不生效。
解决办法:如果要使同一个类中的方法之间调用也被拦截,需要使用spring容器中的实例对象,而不是使用默认的this,因为通过bean实例的调用才会被spring的aop拦截
本例使用方法:AsyncService asyncService = (); 然后使用这个引用调用本地的方法即可达到被拦截的目的
备注:这种方法只能拦截protected,default,public方法,private方法无法拦截。这个是spring aop的一个机制。
2、如果不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor。SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。并发大的时候会产生严重的性能问题。
3、异步方法返回类型只能有两种:void和。
1)当返回类型为void的时候,方法调用过程产生的异常不会抛到调用者层面,
可以通过注AsyncUncaughtExceptionHandler来捕获此类异常
2)当返回类型为Future的时候,方法调用过程产生的异常会抛到调用者层面
在Spring Boot主类中定义一个线程池,public Executor taskExecutor() 方法用于自定义自己的线程池,线程池前缀”taskExecutor-”。如果不定义,则使用系统默认的线程池。
上面我们通过ThreadPoolTaskExecutor创建了一个线程池,同时设置了如下参数:
核心线程数10:线程池创建时初始化的线程数
最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
缓冲队列200:用来缓冲执行任务的队列
允许线程的空闲时间60秒:超过了核心线程数之外的线程,在空闲时间到达之后会被销毁
线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
线程池对拒绝任务的处理策略:此处采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在execute方法的调用线程中运行被拒绝的任务;如果执行程序已被关闭,则会丢弃该任务
设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
也可以单独类来配置线程池:
只需要在@Async注解中指定线程池名即可
Bean文件配置: spring_1. 线程的前缀为xmlExecutor2. 启动异步线程池配置
启动类导入xml文件:
线 程池参数说明
1. ‘id’ : 线程名称的前缀
2. ‘pool-size’:线程池的大小。支持范围”min-max”和固定值(此时线程池core和max sizes相同)
3. ‘queue-capacity’ :排队队列长度
4. ‘rejection-policy’: 对方拒绝的任务处理策略
5. ‘keep-alive’ : 线程保护时间(单位秒)
上面也提到:在调用方法时,可能出现方法中抛出异常的情况。在异步中主要有有两种异常处理方法:
a) 、一种是在调用future的get时捕获异常;
b)、 在异常方法中直接捕获异常
实现AsyncConfigurer接口对异常线程池更加细粒度的控制a) 创建线程自己的线程池b) 对void方法抛出的异常处理的类AsyncUncaughtExceptionHandler
上面也提到:如果不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor。SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。并发大的时候会产生严重的性能问题。
一般的错误OOM:OutOfMemoryError:unable to create new native thread,创建线程数量太多,占用内存过大.
解决办法:一般最好使用自定义线程池,做一些特殊策略, 比如自定义拒绝策略,如果队列满了,则拒绝处理该任务。
原文链接:
java 异步发送短信,异步怎么实现
java 异步发送短信,异步实现:1,使用spring框架的异步注解 @Async ,底层应该是一个线程。 2,简单粗暴的方式:开一个线程 new Thread(new Runnable() {public void run() {//发送短信}})();当然也可以高级一点,使用线程池。 3,更高端一点:使用消息队列MQ
spring异步方法@Async
在Spring Boot中,我们只需要使用@Async注解就能简单的将原来的同步函数变为异步函数。 开启方法:启动类或者配置类上加@EnableAsync注解,然后在方法或者类上加@Async,类上加注解表示类中方法都实现异步调用。 工作原理: spring 在扫描bean的时候会扫描方法上是否包含@async的注解,如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类,代理类是继承我们所写的bean的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会调用父类的对应方法。 spring自己维护了一个队列,他会把需要执行的方法,放入队列中,等待线程池去读取这个队列,完成方法的执行,从而完成了异步的功能。 spring提供了默认线程池ThreadPoolTaskExecutor,支持手动配置属性。 需要注意的地方: 1.在同一个类中的方法调用,添加@async注解是失效的。 原因是当你在同一个类中的时候,方法调用是在类中执行的,spring无法截获这个方法调用,也就不会在代理类里执行。 2.可能会导致循环依赖,spring本身会解决循环依赖,但是因为@Async使用代理模式,spring在检查第二级缓存和原始对象是否相等时发现不相等,会抛出异常。 3.无法获取请求上下文。
若对本页面资源感兴趣,请点击下方或右方图片,注册登录后
搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源
如有其他疑问,请咨询右下角【在线客服】,谢谢支持!
相关文章
- 绿色对决:植物大战僵尸普通版下载,体验策略较量 (绿色决心)
- 抵御僵尸入侵:下载植物大战僵尸,畅享塔防乐趣 (抵御僵尸入侵的方法)
- 畅玩经典之作:植物大战僵尸普通版免费下载 (畅游经典的古诗)
- 免费赋能手机数据恢复:10 款软件助您应对任何数据灾难 (赋能下载)
- 数据恢复的经济之选:10 款不容错过的免费手机数据恢复软件 (数据恢复的经历)
- 打破数据丢失枷锁:免费手机数据恢复软件的终极指南 (打破数据丢失怎么办)
- 掌握手机数据恢复的艺术:10 款免费软件,满足您的所有需求 (掌握手机数据的软件)
- 解锁免费手机数据恢复软件的神奇力量,从此无惧数据丢失 (免费解锁手机密码软件)
- 手机数据救星:10 款免费软件,助您恢复宝贵数据 (手机数据救星怎么用)
- 终极指南:免费手机数据恢复软件,拯救你的珍贵数据 (终极指南针官方网站)
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~