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

本文介绍了Java高并发编程中@Async注解的使用,探讨了如何自定义线程池,分析了@Async失效的原因,并对比了ThreadPoolTaskExecutor和ThreadPoolExecutor的区别。此外,还讨论了线程池核心线程数的配置以及线程池执行过程中的考量因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、@Async注解

@Async的作用就是异步处理任务。

  1. 在方法上添加@Async,表示此方法是异步方法;
  2. 在类上添加@Async,表示类中的所有方法都是异步方法;
  3. 使用此注解的类,必须是Spring管理的类;
  4. 需要在启动类或配置类中加入@EnableAsync注解,@Async才会生效;

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

默认线程池的默认配置如下:

  1. 默认核心线程数:8;
  2. 最大线程数:Integet.MAX_VALUE;
  3. 队列使用LinkedBlockingQueue;
  4. 容量是:Integet.MAX_VALUE;
  5. 空闲线程保留时间:60s;
  6. 线程池拒绝策略:AbortPolicy;

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

### Java `@Async` 注解自定义线程池配置及使用方法 #### 配置自定义线程池 为了使 `@Async` 使用特定的线程池而非 Spring 默认提供者,需先创建并配置一个 `TaskExecutor` Bean。这可以通过在任意 `@Configuration` 类中声明来完成。 ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.Executor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration public class AsyncConfig { @Bean(name = "myExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(25); executor.initialize(); return executor; } } ``` 上述代码片段展示了如何通过设置核心线程数、最大线程数以及队列容量来自定义线程池属性[^1]。 #### 应用 `@Async` 注解 一旦有了自定义线程池,在目标服务类的方法上应用 `@Async` 注解即可让其异步运行。需要注意的是,这里指定了要使用的线程池名称 `"myExecutor"` 来确保该方法由之前定义的任务执行器处理。 ```java import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @Service public class AsyncTest { @Async("myExecutor") public void executeAsync() { System.out.println(Thread.currentThread().getName()); System.out.println("Executing asynchronously"); } } ``` 当调用带有 `@Async` 的方法时,它将在不同的线程上下文中被执行,并不会阻塞主线程直到操作完成。 此外,为了让应用程序识别这些配置,还需启用全局异步支持: ```java import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableAsync public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这样就完成了整个流程——从配置到实际运用 `@Async` 和自定义线程池的工作方式[^2]。
评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值