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

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条)

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记