@Async注解

        @Async 是 Spring 框架中用于声明异步方法的注解。使用此注解的方法会在一个独立的线程中执行,而不是在调用者的线程中,从而实现非阻塞操作。下面是一些关于 @Async 注解及其参数的基本说明:


基本使用

        要使用 @Async,首先需要确保已在配置类或 XML 配置文件中启用了异步支持。可以通过在配置类或启动类上添加 @EnableAsync 注解来启用。

@Configuration
@EnableAsync
public class AppConfig {
//......
}

        然后可以在任何 Spring 管理的 bean 的方法上使用 @Async 来标记它为异步执行。

@Component
public class AsyncTask {

    @Async
    public void executeAsyncTask() {
        // 异步任务逻辑
    }
}

参数说明

        value (别名: beanName): 可选参数,指定一个特定的任务执行器(executor)的 bean 名称。如果没有指定,则会使用默认的执行器。例如,如果想要使用自定义的执行器,可以这样做:

@Async("myExecutor")
public void executeAsyncTask() {
    // 使用名为'myExecutor'的执行器进行异步任务
}

        在这种情况下,你需要在配置类中定义这个执行器 bean。

@Configuration
@Data
public class ExecutorConfig {

        @Bean("myExecutor")
        public Executor myExecutorPool(){
            //此类由Spring提供,org.springframework.scheduling.concurrent包下,是线程池的封装类
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            //线程池中线程的名字前缀
            executor.setThreadNamePrefix("asyncTaskPool-task-");
            //线程池核心线程数量
            executor.setCorePoolSize(5);
            //线程池最大线程数量
            executor.setMaxPoolSize(10);
            //线程池空闲线程存活时间,单位秒
            executor.setKeepAliveSeconds(100);
            //线程池拒绝策略
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            //线程池任务队容量,如果不设置则默认 Integer.MAX_VALUE,
            // 队列默认使用LinkedBlockingQueue 若queueCapacity的值 <= 0,则使用SynchronousQueue
            //executor.setQueueCapacity(1000);

            //线程池中核心线程是否允许超时,默认为false
            executor.setAllowCoreThreadTimeOut(true);

            //线程池中的超时处理时间,单位秒有一个对应方法为毫秒,,默认为不超时
            executor.setAwaitTerminationSeconds(60);

            //初始化线程池,不可以少,否者会抛出 线程池没有初始化
            executor.initialize();
            return executor;
        }

}

注意

        尽管 @Async 支持一些其他属性如 proxyTargetClassmode,这些通常是与 AOP 代理机制相关的高级选项,一般不需要特别设置。

        此外,重要的是要注意 @Async 方法不会在同一个类内部自动生效,因为 Spring AOP 默认是基于代理的。如果你在同一个类里面直接调用带有 @Async 注解的方法,那么该方法实际上是以同步方式运行的。为了克服这个问题,你可以重构代码,使得异步方法被另一个 Spring 管理的 bean 调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值