hzk11o11k11o 2021-04-02 09:06 采纳率: 30%
浏览 928
已采纳

springboot的@Async,如何控制执行顺序?

假设我有三个方法想要异步,在一个类中,有如下调用

Utils.insertUser();

Utils.insertAddress();

Utils.insertInformation();

Utils.selectAll()

首先,前三个方法是设置了@Async的注解方法,假设他是往数据库里面插入数据,第四个是把插入的数据查出来,数据来源就是前三个方法,这个方法没有@Async注解。

现在的问题是,由于前三个方法设置了@Async,导致前三个方法可能还未执行完毕,第四个查询方法就已经开始执行了,这样就没有意义了。所以,如何做到保证前三个方法异步执行,且全部执行完毕后,再执行第四个方法?

  • 写回答

6条回答 默认 最新

  • CSDN专家-三岁丫 2021-04-02 10:09
    关注

    其实你可以不用 @Asyn,只是想要这三个操作并发执行而已

      public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newCachedThreadPool();
        CountDownLatch latch = new CountDownLatch(3);
    
        executorService.execute(() -> {
          try {
            TimeUnit.SECONDS.sleep(1);
            System.out.println("执行第一个操作");
          } catch (InterruptedException e) {
          } finally {
            latch.countDown();
          }
        });
    
        executorService.execute(() -> {
          try {
            TimeUnit.SECONDS.sleep(2);
            System.out.println("执行第二个操作");
          } catch (InterruptedException e) {
          } finally {
            latch.countDown();
          }
        });
    
        executorService.execute(() -> {
          try {
            TimeUnit.SECONDS.sleep(3);
            System.out.println("执行第三个操作");
          } catch (InterruptedException e) {
          } finally {
            latch.countDown();
          }
        });
        
        // 等待前三个执行完毕
        latch.await();
    
        System.out.println("执行第四个操作");
        executorService.shutdown();
      }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格