Why CompletableFuture thenAccept () does not work in the main thread

I handle a lengthy operation inside CompletingFuture supplyAsync () and get the result in thenAccept (). In some cases, thenAccept () executes in the main thread, but for a while it runs on the worker thread. But I want to perform the thenAccept () operation only in the main thread. This is a sample code.

private void test() {

    ExecutorService executorService = Executors.newSingleThreadExecutor();

    CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
        System.out.println("supplyAsync | I am running on : " + Thread.currentThread().getName());
        return "Hello world";
    }, executorService);

    CompletableFuture<Void> cf3 = cf1.thenAccept(s -> {
        System.out.print("thenAccept | I am running on : " + Thread.currentThread().getName());
        System.out.println(" | answer : " + s);
    });

    cf3.thenRun(() -> {
        System.out.println("thenRun | I am running on : " + Thread.currentThread().getName());
        System.out.println();
    });

}

public static void main(String[] args) {

    App app = new App();
    for(int i = 0; i < 3; i++){
        app.test();
    }
}

result:

supplyAsync | I am running on : pool-1-thread-1
thenAccept | I am running on : main | answer : Hello world
thenRun | I am running on : main

supplyAsync | I am running on : pool-2-thread-1
thenAccept | I am running on : main | answer : Hello world
thenRun | I am running on : main

supplyAsync | I am running on : pool-3-thread-1
thenAccept | I am running on : pool-3-thread-1 | answer : Hello world
thenRun | I am running on : pool-3-thread-1

How can i fix this?

+4
source share
1 answer

Take a look at the JavaDoc CompletableFuture . The interesting part is the CompletionStage policy .

, --. , Java Runtime. UNSAFE , , - .

thenAcceptAsync() thenRunAsync() executorService .

+1

All Articles