Java高并发编程实战5,异步注解@Async自定义线程池

Async注解的作用是异步处理任务。在使用@Async时,如果不指定线程池的名称,默认线程池是Spring默认的线程池SimpleAsyncTaskExecutor。默认线程池的配置如下:从最大线程数可以看出,在并发情况下,会无限制地创建线程。也可以通过yml重新配置:也可以自定义线程池,下面通过简单的代码来实现@Async自定义线程池。
Java高并发编程实战5,异步注解@Async自定义线程池
@Async注解的作用是异步处理任务。

在使用@Async时,如果不指定线程池的名称,默认线程池是Spring默认的线程池SimpleAsyncTaskExecutor。

默认线程池的配置如下:

从最大线程数可以看出,在并发情况下,会无限制地创建线程。

也可以通过yml重新配置:

也可以自定义线程池,下面通过简单的代码来实现@Async自定义线程池。

二、代码实例

导入POM

配置类AsyncTaskConfig

UserController

UserService

UserServiceImpl

三、为什么在文件内执行异步任务,还是一个线程,没有实现@Async效果?

在众多尝试中,找到了@Async失效的几个原因:

四、配置中使用了ThreadPoolTaskExecutor和ThreadPoolExecutor,这两个有什么区别?

ThreadPoolTaskExecutor是spring core包中的,而ThreadPoolExecutor是JDK中的JUC。

1、initialize()

查看ThreadPoolTaskExecutor的initialize()方法

2、initializeExecutor抽象方法

再查看initializeExecutor抽象方法的具体实现类,其中有一个就是ThreadPoolTaskExecutor类,查看它的initializeExecutor方法,使用的就是ThreadPoolExecutor。

因此可以了解到ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装。

五、核心线程数

配置文件中的线程池核心线程数为何配置为Runtime.getRuntime().availableProcessors()?

获取的是CPU核心线程数,也就是计算资源。

在实际中,需要对具体的线程池大小进行调整,可以通过压测及机器设备现状,进行调整大小。如果线程池太大,则会造成CPU不断的切换,对整个系统性能也不会有太大的提升,反而会导致系统缓慢。

六、线程池执行流程2024-08-09
mengvlog 阅读 25 次 更新于 2025-08-09 05:03:21 我来答关注问题0
  • 最简单的方法是使用Thread类。在Java 8以上版本,可以使用Lambda表达式简化代码。创建一个Thread对象来执行异步任务。下面提供同步和异步版本的示例进行对比。同步执行时,耗时4002 ms;异步执行耗时2064 ms,异步方式明显提高了效率。在示例中,一个线程在main方法内启动,执行异步任务。主线程与线程并发运行,...

  •  文暄生活科普 Java实现异步编程的8种方式

    4.4 Spring的@Async异步:Spring框架提供了一个方便的机制来实现异步任务执行,通过@Async注解标注方法,Spring会自动将此方法提交给线程池执行。在实际项目中,推荐使用自定义线程池,避免直接使用@Async注解。4.5 Spring ApplicationEvent事件实现异步:利用Spring的事件机制,可以实现异步响应。当程序出现异常...

  •  文暄生活科普 Java异步非阻塞编程的几种方式

    在JDK 9中,Reactive Streams被封装为Java.util.concurrent.Flow接口。这为开发者提供了一种标准化的方法来实现异步数据流的处理,提高了编程的可读性和可维护性。以Reactor、Spring 5以及Spring WebFlux为例,展示了Flux和Mono在处理异步数据流时的高效性。Reactor框架提供了一系列工具和库,使得开发者能够...

  • Java 8 引入了CompletableFuture,一个增强的异步编程工具,位于java.util.concurrent包中。它在Future的基础上提供了更多的功能,特别是处理异步任务之间的依赖和并行操作。Future是Java 5引入的异步计算结果接口,允许启动任务并获取结果,但功能有限,不支持表达多任务依赖。相比之下,CompletableFuture支持任务...

  • Java异步非阻塞编程主要有以下几种方式:Future机制:简介:在JDK 1.5版本中,Java提供了Future抽象,允许主线程在不阻塞的情况下发送多个IO请求,并在请求完成后得到结果。优点:提高了资源利用率,主线程可以执行其他任务。缺点:虽然主线程不再等待IO响应,但仍需等待Future对象完成,这在一定程度上限制...

檬味博客在线解答立即免费咨询

编程相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部