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 触发的,我必须尽快返回存储故事的结果。
试试这个代码
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);
}
}