MST

星途 面试题库

面试题:Java中CompletableFuture如何传递执行上下文

请简述在Java的CompletableFuture中,默认情况下执行上下文是如何传递的?如果希望自定义传递某些上下文信息,应该怎么做?举例说明。
46.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

默认情况下执行上下文的传递

在Java的CompletableFuture中,默认情况下执行上下文(如线程上下文、安全上下文等)会从发起异步操作的线程传递到处理结果的后续阶段。例如,当在主线程中创建一个CompletableFuture并调用thenApply等方法时,后续处理逻辑会在与主线程相同的执行上下文中运行(如果没有指定自定义的执行器)。

自定义传递上下文信息

  1. 使用ThreadLocal:可以利用ThreadLocal来存储和传递上下文信息。ThreadLocal为每个线程提供独立的变量副本,在发起异步操作前将上下文信息存入ThreadLocal,在后续处理逻辑中取出。
    import java.util.concurrent.CompletableFuture;
    import java.util.concurrent.ExecutionException;
    
    public class CompletableFutureContextExample {
        private static final ThreadLocal<String> context = new ThreadLocal<>();
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            context.set("custom context");
            CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
                return "result";
            }).thenApply(result -> {
                String ctx = context.get();
                return ctx + " - " + result;
            });
            System.out.println(future.get());
            context.remove();
        }
    }
    
  2. 自定义执行器并传递上下文:创建自定义的线程池执行器,并在提交任务时将上下文信息作为参数传递。
    import java.util.concurrent.*;
    
    public class CustomExecutorContextExample {
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            ExecutorService executor = Executors.newFixedThreadPool(1);
            String customContext = "custom context";
            CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "result", executor)
                   .thenApplyAsync(result -> {
                        return customContext + " - " + result;
                    }, executor);
            System.out.println(future.get());
            executor.shutdown();
        }
    }
    

在上述代码中,第一种方式通过ThreadLocal在不同阶段传递上下文信息,第二种方式通过自定义执行器在提交任务时直接传递上下文信息。