¿Cuáles son las formas de pasar a threadpoolexecutor CompletableFuture?

Mayur:

He estado trabajando en Java CompletableFuture últimamente y encontré, siempre debemos Threadpool un uso personalizado. Con él, me encontré con dos formas de pasar a subprocesos código existente. Como abajo

Este es mi ThreadPool en el archivo de configuración

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

1. Pasando existingThreadPool en el argumento.

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

2. Usando asíncrono, como a continuación

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

¿hay alguna tercera vía en el que puedo escribir CompletableFuture Handler o Anular su comportamiento existente en un solo lugar donde pueda pasar a medida Threadpool. Y después de que donde quiera que utilizo a continuación código, se debe elegir mi ThreadPool existente en lugar de la piscina forkJoin.

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

No hay manera estándar para reemplazar el ejecutor por defecto para todos los CompletableFuturecasos. Pero desde Java 9, se puede definir un ejecutor por defecto para las subclases. por ejemplo, con

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);
    }
}

que hizo todas las medidas necesarias para definir el ejecutor por defecto para todas las etapas encadenadas del MyCompletableFuture. La bodega ejecutor en EXECsólo sirve como un ejemplo, la producción de una copia impresa cuando se usa, por lo que cuando se utiliza esa clase como ejemplo

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

se imprimirá

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=192477&siteId=1
Recomendado
Clasificación