首页 > 解决方案 > 将 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());

标签: javamultithreadingspring-bootcompletable-future

解决方案


没有标准方法可以替换所有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

推荐阅读