CompletableFuture工具类,提供高性能的多线程编排功能,支持自定义线程池和虚拟线程

26 阅读6分钟
package util;

import java.time.Duration;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.*;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

/**
 * CompletableFuture工具类,提供高性能的多线程编排功能
 * 支持自定义线程池和虚拟线程
 */
public class CompletableFutureUtils {

    /**
     * 默认线程池 - 使用ForkJoinPool.commonPool()作为默认执行器
     * ForkJoinPool采用工作窃取算法,适合CPU密集型任务
     */
    private static final Executor DEFAULT_EXECUTOR = ForkJoinPool.commonPool();
    
    /**
     * 创建虚拟线程执行器(需要Java 21+)
     * 虚拟线程适合IO密集型任务,可以创建大量线程而不会消耗过多系统资源
     * 
     * @return 虚拟线程执行器
     */
    public static Executor virtualThreadExecutor() {
        return Executors.newVirtualThreadPerTaskExecutor();
    }
    
    /**
     * 创建自定义线程池
     * 
     * @param corePoolSize 核心线程数
     * @param maxPoolSize 最大线程数
     * @param keepAliveTime 空闲线程存活时间(秒)
     * @param queueCapacity 任务队列容量
     * @param threadNamePrefix 线程名前缀
     * @return 自定义线程池
     */
    public static ThreadPoolExecutor createThreadPool(
            int corePoolSize,
            int maxPoolSize,
            long keepAliveTime,
            int queueCapacity,
            String threadNamePrefix) {
        return new ThreadPoolExecutor(
                corePoolSize,
                maxPoolSize,
                keepAliveTime,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(queueCapacity),
                r -> {
                    Thread thread = new Thread(r);
                    thread.setName(threadNamePrefix + "-" + thread.getId());
                    return thread;
                },
                new ThreadPoolExecutor.CallerRunsPolicy()
        );
    }
    
    /**
     * 异步执行任务
     * 
     * @param supplier 任务提供者
     * @param executor 执行器,如果为null则使用默认执行器
     * @param <T> 返回值类型
     * @return CompletableFuture对象
     */
    public static <T> CompletableFuture<T> supplyAsync(Supplier<T> supplier, Executor executor) {
        return CompletableFuture.supplyAsync(supplier, executor != null ? executor : DEFAULT_EXECUTOR);
    }
    
    /**
     * 使用默认执行器异步执行任务
     * 
     * @param supplier 任务提供者
     * @param <T> 返回值类型
     * @return CompletableFuture对象
     */
    public static <T> CompletableFuture<T> supplyAsync(Supplier<T> supplier) {
        return supplyAsync(supplier, null);
    }
    
    /**
     * 异步执行无返回值的任务
     * 
     * @param runnable 任务
     * @param executor 执行器,如果为null则使用默认执行器
     * @return CompletableFuture对象
     */
    public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) {
        return CompletableFuture.runAsync(runnable, executor != null ? executor : DEFAULT_EXECUTOR);
    }
    
    /**
     * 使用默认执行器异步执行无返回值的任务
     * 
     * @param runnable 任务
     * @return CompletableFuture对象
     */
    public static CompletableFuture<Void> runAsync(Runnable runnable) {
        return runAsync(runnable, null);
    }
    
    /**
     * 等待所有CompletableFuture完成并收集结果
     * 
     * @param futures CompletableFuture集合
     * @param <T> 返回值类型
     * @return 包含所有结果的CompletableFuture
     */
    public static <T> CompletableFuture<List<T>> allOf(Collection<CompletableFuture<T>> futures) {
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(
                futures.toArray(new CompletableFuture[0]));
        
        return allFutures.thenApply(v -> 
                futures.stream()
                       .map(CompletableFuture::join)
                       .collect(Collectors.toList())
        );
    }
    
    /**
     * 执行多个任务并等待所有完成
     * 
     * @param suppliers 任务提供者列表
     * @param executor 执行器
     * @param <T> 返回值类型
     * @return 包含所有结果的CompletableFuture
     */
    public static <T> CompletableFuture<List<T>> allOf(
            Collection<Supplier<T>> suppliers, Executor executor) {
        List<CompletableFuture<T>> futures = suppliers.stream()
                .map(supplier -> supplyAsync(supplier, executor))
                .collect(Collectors.toList());
        
        return allOf(futures);
    }
    
    /**
     * 使用默认执行器执行多个任务并等待所有完成
     * 
     * @param suppliers 任务提供者列表
     * @param <T> 返回值类型
     * @return 包含所有结果的CompletableFuture
     */
    public static <T> CompletableFuture<List<T>> allOf(Collection<Supplier<T>> suppliers) {
        return allOf(suppliers, null);
    }
    
    /**
     * 等待任意一个CompletableFuture完成并返回其结果
     * 
     * @param futures CompletableFuture集合
     * @param <T> 返回值类型
     * @return 最先完成的CompletableFuture的结果
     */
    @SafeVarargs
    public static <T> CompletableFuture<T> anyOf(CompletableFuture<T>... futures) {
        return CompletableFuture.anyOf(futures).thenApply(o -> (T) o);
    }
    
    /**
     * 执行多个任务并等待任意一个完成
     * 
     * @param suppliers 任务提供者列表
     * @param executor 执行器
     * @param <T> 返回值类型
     * @return 最先完成的任务的结果
     */
    @SuppressWarnings("unchecked")
    public static <T> CompletableFuture<T> anyOf(
            Collection<Supplier<T>> suppliers, Executor executor) {
        CompletableFuture<T>[] futures = suppliers.stream()
                .map(supplier -> supplyAsync(supplier, executor))
                .toArray(CompletableFuture[]::new);
        
        return (CompletableFuture<T>) CompletableFuture.anyOf(futures);
    }
    
    /**
     * 使用默认执行器执行多个任务并等待任意一个完成
     * 
     * @param suppliers 任务提供者列表
     * @param <T> 返回值类型
     * @return 最先完成的任务的结果
     */
    public static <T> CompletableFuture<T> anyOf(Collection<Supplier<T>> suppliers) {
        return anyOf(suppliers, null);
    }
    
    /**
     * 异步应用函数转换CompletableFuture的结果
     * 
     * @param future CompletableFuture对象
     * @param function 转换函数
     * @param executor 执行器
     * @param <T> 输入类型
     * @param <U> 输出类型
     * @return 转换后的CompletableFuture
     */
    public static <T, U> CompletableFuture<U> thenApplyAsync(
            CompletableFuture<T> future, 
            Function<T, U> function, 
            Executor executor) {
        return future.thenApplyAsync(function, executor != null ? executor : DEFAULT_EXECUTOR);
    }
    
    /**
     * 使用默认执行器异步应用函数转换CompletableFuture的结果
     * 
     * @param future CompletableFuture对象
     * @param function 转换函数
     * @param <T> 输入类型
     * @param <U> 输出类型
     * @return 转换后的CompletableFuture
     */
    public static <T, U> CompletableFuture<U> thenApplyAsync(
            CompletableFuture<T> future, 
            Function<T, U> function) {
        return thenApplyAsync(future, function, null);
    }
    
    /**
     * 异步组合两个CompletableFuture的结果
     * 
     * @param future1 第一个CompletableFuture
     * @param future2 第二个CompletableFuture
     * @param combiner 组合函数
     * @param executor 执行器
     * @param <T> 第一个CompletableFuture的结果类型
     * @param <U> 第二个CompletableFuture的结果类型
     * @param <V> 组合后的结果类型
     * @return 组合后的CompletableFuture
     */
    public static <T, U, V> CompletableFuture<V> thenCombineAsync(
            CompletableFuture<T> future1,
            CompletableFuture<U> future2,
            BiFunction<T, U, V> combiner,
            Executor executor) {
        return future1.thenCombineAsync(future2, combiner, 
                executor != null ? executor : DEFAULT_EXECUTOR);
    }
    
    /**
     * 使用默认执行器异步组合两个CompletableFuture的结果
     * 
     * @param future1 第一个CompletableFuture
     * @param future2 第二个CompletableFuture
     * @param combiner 组合函数
     * @param <T> 第一个CompletableFuture的结果类型
     * @param <U> 第二个CompletableFuture的结果类型
     * @param <V> 组合后的结果类型
     * @return 组合后的CompletableFuture
     */
    public static <T, U, V> CompletableFuture<V> thenCombineAsync(
            CompletableFuture<T> future1,
            CompletableFuture<U> future2,
            BiFunction<T, U, V> combiner) {
        return thenCombineAsync(future1, future2, combiner, null);
    }
    
    /**
     * 异步处理CompletableFuture的结果
     * 
     * @param future CompletableFuture对象
     * @param action 处理动作
     * @param executor 执行器
     * @param <T> 结果类型
     * @return CompletableFuture对象
     */
    public static <T> CompletableFuture<Void> thenAcceptAsync(
            CompletableFuture<T> future,
            java.util.function.Consumer<T> action,
            Executor executor) {
        return future.thenAcceptAsync(action, executor != null ? executor : DEFAULT_EXECUTOR);
    }
    
    /**
     * 使用默认执行器异步处理CompletableFuture的结果
     * 
     * @param future CompletableFuture对象
     * @param action 处理动作
     * @param <T> 结果类型
     * @return CompletableFuture对象
     */
    public static <T> CompletableFuture<Void> thenAcceptAsync(
            CompletableFuture<T> future,
            java.util.function.Consumer<T> action) {
        return thenAcceptAsync(future, action, null);
    }
    
    /**
     * 异步处理异常
     * 
     * @param future CompletableFuture对象
     * @param handler 异常处理函数
     * @param executor 执行器
     * @param <T> 结果类型
     * @return CompletableFuture对象
     */
    public static <T> CompletableFuture<T> exceptionallyAsync(
            CompletableFuture<T> future,
            Function<Throwable, T> handler,
            Executor executor) {
        return future.exceptionallyAsync(handler, executor != null ? executor : DEFAULT_EXECUTOR);
    }
    
    /**
     * 使用默认执行器异步处理异常
     * 
     * @param future CompletableFuture对象
     * @param handler 异常处理函数
     * @param <T> 结果类型
     * @return CompletableFuture对象
     */
    public static <T> CompletableFuture<T> exceptionallyAsync(
            CompletableFuture<T> future,
            Function<Throwable, T> handler) {
        return exceptionallyAsync(future, handler, null);
    }
    
    /**
     * 异步处理完成事件(无论成功或异常)
     * 
     * @param future CompletableFuture对象
     * @param action 完成动作
     * @param executor 执行器
     * @param <T> 结果类型
     * @return CompletableFuture对象
     */
    public static <T> CompletableFuture<T> whenCompleteAsync(
            CompletableFuture<T> future,
            BiConsumer<T, Throwable> action,
            Executor executor) {
        return future.whenCompleteAsync(action, executor != null ? executor : DEFAULT_EXECUTOR);
    }
    
    /**
     * 使用默认执行器异步处理完成事件
     * 
     * @param future CompletableFuture对象
     * @param action 完成动作
     * @param <T> 结果类型
     * @return CompletableFuture对象
     */
    public static <T> CompletableFuture<T> whenCompleteAsync(
            CompletableFuture<T> future,
            BiConsumer<T, Throwable> action) {
        return whenCompleteAsync(future, action, null);
    }
    
    /**
     * 设置CompletableFuture超时
     * 
     * @param future CompletableFuture对象
     * @param timeout 超时时间
     * @param timeUnit 时间单位
     * @param defaultValue 超时默认值
     * @param <T> 结果类型
     * @return 设置了超时的CompletableFuture
     */
    public static <T> CompletableFuture<T> orTimeout(
            CompletableFuture<T> future,
            long timeout,
            TimeUnit timeUnit,
            T defaultValue) {
        return future.orTimeout(timeout, timeUnit)
                .exceptionally(ex -> {
                    if (ex instanceof TimeoutException) {
                        return defaultValue;
                    }
                    throw new CompletionException(ex);
                });
    }
    
    /**
     * 设置CompletableFuture超时(Java 9+)
     * 
     * @param future CompletableFuture对象
     * @param timeout 超时时间
     * @param timeUnit 时间单位
     * @param <T> 结果类型
     * @return 设置了超时的CompletableFuture
     */
    public static <T> CompletableFuture<T> orTimeout(
            CompletableFuture<T> future,
            long timeout,
            TimeUnit timeUnit) {
        return future.orTimeout(timeout, timeUnit);
    }
    
    /**
     * 设置CompletableFuture超时(使用Duration)
     * 
     * @param future CompletableFuture对象
     * @param duration 超时时间
     * @param <T> 结果类型
     * @return 设置了超时的CompletableFuture
     */
    public static <T> CompletableFuture<T> orTimeout(
            CompletableFuture<T> future,
            Duration duration) {
        return future.orTimeout(duration.toMillis(), TimeUnit.MILLISECONDS);
    }
    
    /**
     * 批量执行任务并收集结果,支持并行度控制
     * 
     * @param tasks 任务列表
     * @param parallelism 并行度
     * @param executor 执行器
     * @param <T> 结果类型
     * @return 所有任务的结果列表
     */
    public static <T> List<T> executeBatch(
            List<Supplier<T>> tasks,
            int parallelism,
            Executor executor) {
        final Executor actualExecutor = executor != null ? executor : DEFAULT_EXECUTOR;
        
        return tasks.stream()
                .collect(Collectors.groupingBy(t -> tasks.indexOf(t) / parallelism))
                .values().stream()
                .flatMap(batch -> {
                    List<CompletableFuture<T>> futures = batch.stream()
                            .map(task -> CompletableFuture.supplyAsync(task, actualExecutor))
                            .collect(Collectors.toList());
                    
                    CompletableFuture<Void> allFutures = CompletableFuture.allOf(
                            futures.toArray(new CompletableFuture[0]));
                    
                    // 等待当前批次完成
                    allFutures.join();
                    
                    return futures.stream().map(CompletableFuture::join);
                })
                .collect(Collectors.toList());
    }
    
    /**
     * 使用默认执行器批量执行任务并收集结果,支持并行度控制
     * 
     * @param tasks 任务列表
     * @param parallelism 并行度
     * @param <T> 结果类型
     * @return 所有任务的结果列表
     */
    public static <T> List<T> executeBatch(List<Supplier<T>> tasks, int parallelism) {
        return executeBatch(tasks, parallelism, null);
    }
}