如何同步运行两个异步任务

时间:2018-08-29 15:09:44

标签: java multithreading spring-boot

我是java(springboot)中多线程概念的新手,有一个需要解决的场景。有一个函数可以调用2个异步函数,我想使它们的执行同步发生。例如:

public void func(){

call1();
call2();
}

@Async
public void call1(){}

@Async
public void call2(){}

任何人都可以建议一种实现此功能的方法。

谢谢

2 个答案:

答案 0 :(得分:0)

不太清楚这里的动机是什么,但是从我从问题中可以理解的是,目标似乎是您不想阻塞主线程(执行func()的线程),并同时实现串行执行call1()和call2()。如果那是您想要的,则可以使call1()和call2()同步(即删除@Async批注),并添加第三个异步方法(也许是callWrapper()),然后依次调用call1()和call2()用这种方法。

答案 1 :(得分:0)

如果您将@Async方法更改为返回Future,则可以等待。例如这样的

@Component
class AsyncStuff {
    @Async
    public ListenableFuture<?> call1() {
        /** do things */
        return AsyncResult.forValue(null);
    }
    @Async
    public ListenableFuture<?> call2() {
        /** do other things */
        return AsyncResult.forValue(null);
    }
}

@Component
class User {
    @Autowired
    AsyncStuff asyncStuff; // @Async methods work only when they are in a different class

    public void use() throws InterruptedException, ExecutionException {
        asyncStuff
            .call1() // starts this execution in another thread
            .get();  // lets this thread wait for the other thread
        asyncStuff
            .call2() // now start the seconds thing
            .get();  // and wait again
    }
}

但是,与在不进行异步的情况下简单完成所有操作相比,它可以确保速度较慢,因为所有这些添加操作都会在线程之间移动执行。调用线程可以代替等待其他线程执行操作,而只是在这段时间内执行代码本身。