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