CompletableFuture 没有被执行[重复]

问题描述 投票:0回答:1

CompletableFuture 有一个很奇怪的问题

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {

    final static ExecutorService executor = Executors.newCachedThreadPool();

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            final CompletableFuture withoutExecutor = doSomethingOne(i);
//      final CompletableFuture withExecutor = doSomethingTwo(i);
        }
    }

    private static CompletableFuture doSomethingOne(final int i) {
        return CompletableFuture.runAsync(() -> {
            System.out.println("Without Executor " + i);
        });
    }

    private static CompletableFuture doSomethingTwo(final int i) {
        return CompletableFuture.runAsync(() -> {
            System.out.println("With Executor " + i);
        }, executor);
    }
}

main
被执行时,它不会打印任何东西(
withoutExecutor
CompletableFuture 甚至不会被执行)。但是当我取消注释
withExecutor
时,两个 CompletableFutures 都按预期工作。我错过了什么?

我的个人项目也有类似的问题,但总体思路是一样的。我目前在项目中使用带有我的 CompletableFutures 的执行器,它们只运行一定时间,然后它们完全停止运行(即使调试器也没有在 CompletableFuture 中遇到断点)。我需要一个异步后台任务,等待不是一个选项,因为 CompletableFuture 是通过我项目中的 REST API 触发的,我必须尽快返回存储故事的结果。

java multithreading completable-future
1个回答
0
投票

试试这个代码

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {

    private static final ExecutorService executor = Executors.newCachedThreadPool();

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Consumer<Integer> consumer = result -> System.out.println("Result: " + result);
            doSomethingOne(i)
                    .thenAcceptAsync(consumer, executor);
        }
        System.out.println("Main thread is not blocked");
    }

    private static CompletableFuture<Integer> doSomethingOne(final int i) {
        return CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException interruptedException) {
                interruptedException.printStackTrace();
            }
            return i * 3;
        }, executor);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.