当前位置: 首页 > 网络应用技术

为什么不建议使用@ASYNC注释来实现异步?

时间:2023-03-06 18:18:51 网络应用技术

  对于异步方法调用,Spring3提供了@Async注释。该注释可以在该方法上标记,以便可以异步调用此方法。调用者在调用时立即返回,该方法的实际执行将提交给Spring Taskexecutor的任务,该任务将由线程在该任务中执行。指定的线程池。

  在实际项目中,使用@ASYNC调用线程池。推荐方法是使用自定义线程池模式来自定义线程池中常用的方案:重新实现asyncconfigurer接口。

  弹簧的默认线程池是指使用@Async注释时线池的名称。检查源代码, @async的默认线程池是Simpleasynctaskexecutor。

  无回报值的异步呼叫

  在线程池的应用中,请参阅Alibaba Java开发规范:线程池不允许使用执行者创建,并且允许默认线程池使用系统。操作规则以避免资源耗尽的风险。执行者的每种方法的缺点:

  @async的默认异步配置使用Simpleasynctaskexecutor。线程池默认一个任务来创建线程。如果系统在系统中连续创建,该系统最终将导致系统占据过多的内存并导致OutofMemoryError错误。在对线程创建问题的响应中,SimpleSynctasKexecutor提供了当前的限制机制,以控制通过并发货币lillimit的交换机控制开关属性。当偶发性limit> = 0时,当前限制机制被关闭,即当前限制机制,即coldistrencyLimit = -1,它将继续创建一个新的新情况。处理任务的线程。基于默认配置SimpleNctasKexecutor并不是严格的线程池,也不会达到线程重复使用的功能。

  自定义的线程池可以控制系统中系统中系统中的更良好的控制,这很方便地调整线程池的大小,并且线程执行异常的控制和处理。设置系统自定义线程池时默认线程池,尽管可以通过多种模式设置,但默认线程池生成的最终线程池可用,只能设置一个(无法在sashit asyncconfigurer中设置多个类)。自定义线程池具有以下内容方法:

  通过查看有关@ASYNC的@Async的默认调用规则,您将优先检查源代码中的AsyncconFigurer类。该界面的类是AsyncconFigurerSupport。但是,默认配置的线程池和异步处理方法是空的。因此,无论是继承还是重新实现接口,都需要一个线程池。并重新实现public opecutor getAsyncexecutor()方法。

  @ASYNC注释,使用系统的默认线程或自定义线程池(而不是默认线程池)。可以在项目中设置Multi -thread池。调用异步时,需要调用的名称名称,例如@Async(“ new_taskname”)。

  原始:https://juejin.cn/post/7099328896142671903