Spring @Async con CompletableFuture

Tengo una duda sobre este código:

@Async
public CompletableFuture<String> doFoo() {
    CompletableFuture<String> fooFuture = new CompletableFuture<>();  

    try {
        String fooResult = longOp();
        fooFuture.complete(fooResult);
    } catch (Exception e) {
        fooFuture.completeExceptionally(e);
    }

    return fooFuture;
}

La pregunta es: ¿DoFoo regresa a FooFuture solo después de que LongOp haya terminado (ya sea de manera correcta o excepcional) y, por lo tanto, está devolviendo futuros ya completados o Spring está haciendo algo de magia y regresando antes de ejecutar el cuerpo? Si el código está bloqueando en longOp (), ¿cómo expresaría que el cálculo se está enviando a un ejecutor?

Quizás esto? ¿Cualquier otra manera?

@Async
public CompletableFuture<String> doFoo() {

    CompletableFuture<String> completableFuture = new CompletableFuture<>();
    CompletableFuture.runAsync(() -> {
        try {
            String fooResult = longOp();
            completableFuture.complete(fooResult);
        } catch (Exception e) {
            completableFuture.completeExceptionally(e);
        }
    });
    return completableFuture;
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta