gpt4 book ai didi

java - 将threadpoolexecutor传递给CompletableFuture有哪些方式?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:44:49 24 4
gpt4 key购买 nike

我最近一直在研究 Java CompletableFuture 并发现,我们应该始终使用自定义的 Threadpool。有了它,我找到了两种将线程池传递给现有代码的方法。如下图

这是我在配置文件中的ThreadPool

@Override
@Bean(name = "commonThreadPool")
public Executor getAsyncExecutor() {
return new ThreadPoolTaskExecutor();
}

<强>1。在参数中传递 existingThreadPool。

 @Autowired
@Qualifier("commonThreadPool")
TaskExecutor existingThreadPool;
CompletableFuture.runAsync(() -> executeTask(),existingThreadPool);

<强>2。像下面这样使用异步

@Async("commonThreadPool")
public void executeTask() {
// Execute Some Task
}

是否有任何第三种方法可以让我编写 CompletableFuture 处理程序或在我可以传递自定义线程池的单个位置覆盖其现有行为。之后无论我在哪里使用下面的代码,它都应该选择我现有的 ThreadPool 而不是 forkJoin 池。

 CompletableFuture.runAsync(() -> executeTask());

最佳答案

没有标准的方法来替换所有 CompletableFuture 实例的默认执行器。但是从 Java 9 开始,你可以为子类定义一个默认的执行器。例如。与

public class MyCompletableFuture<T> extends CompletableFuture<T> {
static final Executor EXEC = r -> {
System.out.println("executing "+r);
new Thread(r).start();
};

@Override
public Executor defaultExecutor() {
return EXEC;
}

@Override
public <U> CompletableFuture<U> newIncompleteFuture() {
return new MyCompletableFuture<>();
}

public static CompletableFuture<Void> runAsync​(Runnable runnable) {
Objects.requireNonNull(runnable);
return supplyAsync(() -> {
runnable.run();
return null;
});
}

public static <U> CompletableFuture<U> supplyAsync​(Supplier<U> supplier) {
return new MyCompletableFuture<U>().completeAsync(supplier);
}
}

您已完成为 MyCompletableFuture 的所有链接阶段定义默认执行程序的所有必要步骤。 EXEC 中的执行器仅用作示例,在使用时生成打印输出,因此当您使用该示例类时

MyCompletableFuture.supplyAsync(() -> "test")
.thenApplyAsync(String::toUpperCase)
.thenAcceptAsync(System.out::println);

它会打印

executing java.util.concurrent.CompletableFuture$AsyncSupply@65ab7765
executing java.util.concurrent.CompletableFuture$UniApply@119d7047
executing java.util.concurrent.CompletableFuture$UniAccept@404b9385
TEST

关于java - 将threadpoolexecutor传递给CompletableFuture有哪些方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56205410/

24 4 0