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

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 快手联盟怎么快速的跑出建立模型
  • ¥20 ros环境下运行orb-slam一直报错
  • ¥15 关于腾讯云服务器中,PHP页面无法打开的问题
  • ¥60 如何把照片修复成原始拍摄图
  • ¥80 Exited too quickly (process log may have details)
  • ¥15 爬知乎登录之后内容加载不出来
  • ¥15 怎么用protues测量通频带
  • ¥15 zepelin使用sparkInterpreter 异常
  • ¥15 paho mqtt 接收不到消息
  • ¥15 函数r关于两个分量y,z方向上的图像,分开画r随y的图像,r随z的图像