如何在使用异步方法返回的结果之前确保执行它们?

时间:2018-07-29 05:33:16

标签: java spring-boot asynchronous completable-future

我有AsyncService类,其中包含两个异步方法。

@Service
public class AsyncService {
    @Async
    public HashMap<int, Student> studentMap(List<String> students) {
        //contains database call
        return result1;
    }

    @Async
    public HashMap<int, Teacher> teacherMap(List<String> teachers) {
        //contains database call
        return result2;
    }
}

这两个方法是从UserService类中调用的。

@Service
public class UserService {
    public List<User> doJob () {
        HashMap<int, Student> = asyncService.studentMap(students);
        HashMap<int, Teacher> = asyncService.teacherMap(teachers);
        // now work with these HashMap
    }
}

我想确保当我使用这两个异步调用返回的结果时,完成了两个异步方法。我怎样才能做到这一点?我知道未来可以成为解决方案。但是我不确定如何在这里使用它。还有其他解决方案吗?我正在使用弹簧靴。

2 个答案:

答案 0 :(得分:0)

您可以使用CompletableFuture进行操作。这是一个示例:

CompletableFuture.allOf(
                CompletableFuture.runAsync(() ->
                       asyncService.studentMap(students);//make it synchronized call
                ),
                CompletableFuture.runAsync(() ->
                       asyncService.teacherMap(teachers);// make it synchronized call
        ).thenRun(() -> {
            //do after complete 2 async call.
        }).get();

您的服务呼叫需要同步:

@Service
public class AsyncService {
public Hashmap<int, Student> studentMap(List<String> students) {
    //contains database call
    return result1;
}

public Hashmap<int, Teacher> teacherMap(List<String> teachers) {
    //contains database call
}
}

答案 1 :(得分:0)

@Async注释假定带注释的方法返回Future。拥有Future后,您只能使用其他方法来使用结果,除了调用Future.get()之外,start会在异步过程完成后严格执行。 也就是说,正确实现异步服务,您不会遇到任何麻烦。