java - 将 threadpoolexecutor 传递给 CompletableFuture 的方法有哪些?
问题描述
我最近一直在研究 Java CompletableFuture,发现我们应该始终使用自定义的线程池。有了它,我发现了两种将线程池传递给现有代码的方法。像下面
这是我在配置文件中的线程池
@Override
@Bean(name = "commonThreadPool")
public Executor getAsyncExecutor() {
return new ThreadPoolTaskExecutor();
}
1. 在参数中传递现有线程池。
@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 - 如何使用键值检索整个 JSON 对象?
- xml - How to grab specific files recursively and store their relative paths in a dictionary?
- javascript - JQuery DataTables Plugin not showing data ASP.Net
- r - Passing Variable as aes reference
- r - R中KableExtra中的列名格式
- javascript - 静态成员和实例成员有什么区别?
- c# - How to map multiple sources into single destination member
- python - How to solve "ValueError: File 'load.xlsx' is already in use." error encountered when use 'abq_ExcelUtilities.excelUtilities.ExcelToAmplitude' method?
- javascript - Use socket.io with React
- clojure - Nesting vs Threading vs let