面试题答案
一键面试可能出现性能问题的原因
- 线程资源耗尽:创建大量异步任务,若使用默认的ForkJoinPool.commonPool(),可能导致线程数过多,耗尽系统资源,引发上下文切换开销增大。
- 内存压力:大量的CompletableFuture实例及相关中间数据占用过多内存,可能导致频繁的垃圾回收,影响性能。
- 任务调度开销:协调大量任务时,任务调度的开销会显著增加,如任务排队、线程分配等操作。
优化方案
- 自定义线程池:
- 创建合适大小的线程池,根据系统资源(如CPU核心数、内存等)合理设置线程池参数。例如:
ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2); CompletableFuture[] futures = new CompletableFuture[1000]; for (int i = 0; i < 1000; i++) { futures[i] = CompletableFuture.supplyAsync(() -> { // 异步任务逻辑 return null; }, executor); } CompletableFuture.allOf(futures).join(); executor.shutdown();
- 任务分组:
- 将1000个任务分成若干组,每组任务使用allOf方法合并,再将每组的结果合并。例如:
int groupSize = 100; CompletableFuture[] groupFutures = new CompletableFuture[1000 / groupSize]; for (int i = 0; i < 1000 / groupSize; i++) { CompletableFuture[] subFutures = new CompletableFuture[groupSize]; for (int j = 0; j < groupSize; j++) { subFutures[j] = CompletableFuture.supplyAsync(() -> { // 异步任务逻辑 return null; }); } groupFutures[i] = CompletableFuture.allOf(subFutures); } CompletableFuture.allOf(groupFutures).join();
- 使用异步流:
- Java 9引入的异步流可以更高效地处理大量异步任务。例如:
CompletableFuture<Void> future = CompletableFuture .supplyAsync(() -> IntStream.range(0, 1000) .boxed() .collect(Collectors.toList())) .thenApplyAsync(list -> list.stream() .map(i -> CompletableFuture.supplyAsync(() -> { // 异步任务逻辑 return null; })) .collect(Collectors.toList())) .thenApplyAsync(futures -> futures.stream() .map(CompletableFuture::join) .collect(Collectors.toList())) .thenAcceptAsync(results -> { // 处理结果 }); future.join();
CompletableFuture allOf方法实现原理
- 线程池使用:
- 若任务使用supplyAsync等方法提交且未指定线程池,默认使用ForkJoinPool.commonPool()。这个公共线程池是一个共享的线程池,适用于大多数场景,但在高并发且任务量大时可能出现线程资源竞争问题。
- 任务调度:
- allOf方法接受多个CompletableFuture实例,返回一个新的CompletableFuture。这个新的CompletableFuture会在所有传入的CompletableFuture都完成时完成。
- 当调用allOf返回的CompletableFuture的join或get方法时,会阻塞当前线程,直到所有子任务完成。在内部,它会遍历所有子CompletableFuture,为每个子任务注册一个CompletionStage,当子任务完成时,会触发相应的回调,更新父CompletableFuture的状态,当所有子任务都完成时,父CompletableFuture进入完成状态。