SpringBoot异步多线程调用注解@Async使用和CountDownLatch配合使用案例

本文介绍了SpringBoot中使用@Async注解实现异步多线程的方法,包括启用异步注解、注解失效条件、返回值限制。同时,针对主线程未等待子线程完成的问题,提出了使用CountDownLatch解决方案。此外,讨论了线程池的使用以避免频繁创建和销毁线程,以及如何通过Future进行主线程控制。
摘要由CSDN通过智能技术生成

关于多线成调用可能大家用的比较多的是JDK的多线程,springboot1.5+,项目框架中集成了异步多线程操作配置,在这里和大家分享一下springboot的异步多线程注解使用,先一步一步来以代码的形式讲解大家可能会遇到的问题。

一:创建方法,然后在方法上添加@Async注解,然后还需要在@SpringBootApplication启动类或者@configure注解类上 添加注解@EnableAsync启动多线程注解,@Async就会对标注的方法开启异步多线程调用,注意,这个方法的类一定要交给spring容器来管理

@Component
public class Test {
    //注意这个多线程方法的类一定要加@Component注解,拿给spring容器管理
    @Async
    public void doTaskThree(int i) {
        long start = System.currentTimeMillis();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println("第00" + i + "完成任务,耗时:" + (end - start) + "毫秒,线成名为::" + Thread.currentThread().getName());

    }
}

然后 其他方法就可以直接调用此方法了,spring会开启多线程异步调用。

注意:关于注解失效需要注意以下几点

     1,注解的方法必须是public方法

      2,方法一定要从另一个类中调用,也就是从类的外部调用,类的内部调用是无效的,因为@Transactional和@Async注解的实现都是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器。

   3,异步方法使用注解@Async的返回值只能为void或者Future

 

@Autowired
    private Test test;
    @Override
    public List<Integer> findByMonth() {
        List<Integer> list = new ArrayList<>();
        for (int i =1;i<=12;i++){
            int count= baseMapper.findByMonth(i);
            list.add(count);
        }
        System.out.println("开始执行多线程任务1111111111:
  • 11
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
@Async和@PostConstruct是Spring框架中的两个注解,分别用于实现异步方法和在Bean初始化后执行某些逻辑。 @Async注解用于标记一个方法为异步方法,当该方法被调用时,Spring会将其放入一个线程池中进行异步执行,而不会阻塞主线程。这样可以提高系统的并发性能和响应速度。 @PostConstruct注解用于标记一个方法为Bean的初始化方法,在Bean实例化后,Spring会调用被@PostConstruct标记的方法进行一些初始化操作。这个注解通常用于需要在Bean创建之后执行一些逻辑的场景。 在Spring Boot中,你可以同时使用@Async和@PostConstruct注解。例如,你可以在一个Bean的初始化方法上使用@PostConstruct注解,在该方法中调用一个异步方法,以便在系统启动时执行某些耗时操作。 举个例子,假设你有一个名为UserService的Bean,在它的初始化方法中调用一个异步方法来加载用户数据: ```java @Service public class UserService { @Async @PostConstruct public void init() { // 异步加载用户数据 loadData(); } public void loadData() { // 加载用户数据的逻辑 // ... } } ``` 上述代码中,当UserService的Bean被实例化后,Spring会调用init方法,在init方法中调用loadData方法,由于loadData方法被@Async注解标记,它将异步执行,不会阻塞主线程。 注意,为了让@Async注解生效,你需要在Spring Boot的配置类中添加@EnableAsync注解,以启用异步支持。 总结:@Async和@PostConstruct是Spring框架中的两个注解,分别用于实现异步方法和在Bean初始化后执行某些逻辑。在Spring Boot中,你可以同时使用这两个注解来实现异步初始化操作。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值