面试题答案
一键面试默认情况下执行上下文的传递
在Java的CompletableFuture中,默认情况下执行上下文(如线程上下文、安全上下文等)会从发起异步操作的线程传递到处理结果的后续阶段。例如,当在主线程中创建一个CompletableFuture并调用thenApply
等方法时,后续处理逻辑会在与主线程相同的执行上下文中运行(如果没有指定自定义的执行器)。
自定义传递上下文信息
- 使用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(); } }
- 自定义执行器并传递上下文:创建自定义的线程池执行器,并在提交任务时将上下文信息作为参数传递。
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在不同阶段传递上下文信息,第二种方式通过自定义执行器在提交任务时直接传递上下文信息。