每天一个注解-@Async

源码:

它是spring scheduling下的一个注解 

在Java中,@Async注解是Spring框架提供的,用于支持异步方法调用。它允许你将一个方法标记为异步执行,这意味着该方法的调用不会阻塞当前线程,而是由Spring管理的异步任务执行器在后台线程池中执行。

下面是如何在Spring中使用@Async的基本步骤:

  1. 配置异步任务执行器: 在你的Spring配置类中,需要定义一个异步任务执行器(TaskExecutor)。这通常通过@Bean注解的方法来实现。

    @Configuration
    @EnableAsync
    public class AsyncConfig {
    
        @Bean
        public TaskExecutor taskExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(5);
            executor.setMaxPoolSize(10);
            executor.setQueueCapacity(20);
            executor.initialize();
            return executor;
        }
    }
  2. 注意如果在spring中没有将ThreadPoolTaskExecutor对象初始化为bean的话而且必须名称为taskExecutor,spring会默认使用SimpleAsyncTaskExecutor 去执行异步方法。如果你用的是springboot的话,就没问题,因为springboot有自动装配,它会把ThreadPoolTaskExecutor自动装配为taskExecutor bean对象,可以直接用。

  3. 启用异步支持: 你需要在配置类上添加@EnableAsync注解,以启用异步方法的支持。

SimpleAsyncTaskExecutor 

而它不是一个线程池的实现类,它只是不断的创建线程然后执行任务,会导致无限的创建线程,后果很严重

	protected void doExecute(Runnable task) {
		Thread thread = (this.threadFactory != null ? this.threadFactory.newThread(task) : createThread(task));
		thread.start();
	}
  1. 标记异步方法: 在你想异步执行的方法上添加@Async注解。通常,这个方法应该在一个带有@Component注解的类中。

     
    @Component
    public class MyService {
    
        @Async
        public void doSomethingAsync() {
            // 异步执行的代码
        }
    }
  2. 调用异步方法: 你可以像调用普通方法一样调用异步方法,但是需要注意,由于它是异步执行的,所以你不能等待其返回值或抛出的异常。如果你需要返回值,可以使用CompletableFuture作为返回类型。

    @Autowired
    private MyService myService;
    
    public void someMethod() {
        CompletableFuture<Void> future = myService.doSomethingAsync();
        // 这里可以继续执行其他操作,不会被doSomethingAsync阻塞
    }

请记住,在使用@Async时,确保你的Spring Bean是在Spring容器管理之下的,并且要正确处理异步方法的异常和返回结果。如果方法抛出异常,而你没有处理,那么这些异常可能会丢失或者导致不可预期的行为。

demo地址:

springasync: @Async应用 (gitee.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值