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

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 Docker容器里已经安装了ssh,但打包迁移到新机器一直容器一直提示unrecognized service。
  • ¥15 综合布线实例设计,就好看好看不恐怖可好滤镜好聚
  • ¥15 使用moviepy库视频合并时出错
  • ¥30 FLUENT液固传质UDF
  • ¥15 怎么看梯度直方图以,怎么判断梯度消失/爆炸,怎么解决
  • ¥15 aspnetdll文件访问拒绝
  • ¥15 wpf中在模版中寻找元素
  • ¥15 MFC平台生成指定圆
  • ¥15 jmeter出现403
  • ¥500 求华为P30PRO手机硬盘数据恢复