spring中的@Async @EnableAsync注解及线程池

spring对多线程做了很好的支持.主要有@Async @EnableAsync注解.

@Async.直接加在方法上,调用该方法时会自动创建一个线程.线程池默认使用SimpleAsyncTaskExecutor.不重用线程,每次调用都会创建一个新的线程.所以单单使用@Async可能会产生并发问题.需要自定义线程池.使用@Async有以下几个注意事项:

1.要异步执行的方法加上@Async

2.调用异步方法需要配置上注解@EnableAsync.可以在spring入口类加注解,也可以在需要调用异步方法的类上注解也可以直接在配置类加.

3.异步方法不能和调用方法放在一个类里面,必须不同类间调用,所以,很显然异步方法都是public.

4. 在@Async标注的方法,同时也适用了@Transactional进行了标注的情况;在其调用数据库操作之时,将无法产生事务管理的控制,原因就在于其是基于异步处理的操作。 那该如何给这些操作添加事务管理呢?可以将需要事务管理操作的方法放置到异步方法内部,在内部被调用的方法上添加@Transactional.

5.不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor.SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。并发大的时候会产生严重的性能问题.

6.@Async注解一般用在类的方法上,如果用在类上,那么这个类所有的方法都是异步执行的;

7.返回值:需要返回值用AsyncResult或者CompletableFuture

8.@Async默认使用Bean Name为executor的线程池。也可以根据Bean Name指定特定线程池.

9.线程池:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。spring中可以写一个线程池的配置类交给spring管理.为了提高项目的健壮性,不同业务配置不同线程池.

@Bean
    public Executor asyncServiceExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //ThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor();

        //配置核心线程数,线程池维护线程的最少数量
        executor.setCorePoolSize(5);

        //配置最大线程数,线程池维护线程的最大数量
        executor.setMaxPoolSize(5);

        //配置队列大小,缓存队列
        executor.setQueueCapacity(99999);

        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("async-service-");

        // rejection-policy:当pool已经达到max size的时候,如何处理新任务

        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行

        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        //允许的空闲时间 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
        //executor.setKeepAliveSeconds(1);

        //执行初始化
        executor.initialize();

        return executor;

    }
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值