我最近一直在研究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());
答案 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