MST

星途 面试题库

面试题:Java CompletableFuture组合操作中的优化策略

在使用CompletableFuture进行多个任务组合操作时,可能会面临性能问题。请阐述至少两种优化多个CompletableFuture组合操作的策略,并说明每种策略适用的场景,同时给出简单代码示例。
36.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 策略一:合理控制并行度
    • 适用场景:当任务数量较多且系统资源有限时,若并行度过高,会导致线程上下文切换频繁,降低性能。此时可根据系统资源(如CPU核心数)来合理设置并行度。
    • 代码示例
import java.util.concurrent.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class CompletableFutureParallelism {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(IntStream.range(0, 10)
              .mapToObj(i -> CompletableFuture.supplyAsync(() -> {
                    // 模拟任务
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    return i;
                }, executorService))
              .toArray(CompletableFuture[]::new));
        allFutures.join();
        executorService.shutdown();
    }
}
  1. 策略二:减少不必要的中间结果传递
    • 适用场景:如果在CompletableFuture组合操作过程中,存在频繁的中间结果传递和处理,会增加内存开销和处理时间。当某些中间结果在后续操作中不再使用时,可考虑避免不必要的传递。
    • 代码示例
import java.util.concurrent.CompletableFuture;

public class CompletableFutureReduceIntermediate {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
                // 初始任务
                return "initial result";
            })
           .thenAcceptAsync(result -> {
                // 直接处理结果,避免中间结果传递
                System.out.println("Processed: " + result);
            });
    }
}