有什么方法可以将threadpoolexecutor传递给CompletableFuture?

时间:2019-05-19 06:47:36

标签: java multithreading spring-boot completable-future

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

这是我在配置文件中的ThreadPool

@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 Handler或在可以传递自定义线程池的单个位置重写其现有行为。在那之后,无论我在哪里使用下面的代码,它都应该选择我现有的ThreadPool而不是forkJoin池。

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

2 个答案:

答案 0 :(得分:1)

我强烈建议您反对,但如果您确实愿意,可以使用反射更改可完成的将来使用的线程池。

public static void main(String[] args) throws Exception {
    // Prints ForkJoinPool.commonPool-worker-1
    CompletableFuture<Void> c = CompletableFuture.runAsync(() -> System.out.println(Thread.currentThread().getName()));
    c.get();

    setFinalStatic(CompletableFuture.class.getDeclaredField("asyncPool"), Executors.newFixedThreadPool(10));

    // Prints pool-1-thread-1
    c = CompletableFuture.runAsync(() -> System.out.println(Thread.currentThread().getName()));
    c.get();
}

static void setFinalStatic(Field field, Object newValue) throws Exception {
    field.setAccessible(true);
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    field.set(null, newValue);
}

setFinalStatic来自https://stackoverflow.com/a/3301720/1398418

答案 1 :(得分:0)

没有标准方法来替换所有RelativeLayout实例的默认执行程序。但是从Java 9开始,您可以为子类定义默认的执行程序。例如。与

mlflow_client = mlflow.tracking.MlflowClient(tracking_uri='databricks')

您已完成所有必要的步骤,以为CompletableFuture的所有链接阶段定义默认执行程序。保留在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