要在不公开暴露执行线程的情况下返回CompletableFuture,可以使用CompletableFuture的静态方法supplyAsync
。这个方法接受一个Supplier函数式接口作为参数,该接口定义了需要执行的代码逻辑,并且在一个线程池中异步执行。下面是一个示例代码:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class CompletableFutureExample {
public static void main(String[] args) throws Exception {
// 调用方法返回CompletableFuture
CompletableFuture future = calculateAsync();
// 在CompletableFuture上注册回调函数
future.thenAccept(result -> System.out.println("Result: " + result));
// 主线程继续执行其他操作
System.out.println("Doing something else...");
// 阻塞主线程,等待异步任务完成
future.get();
}
public static CompletableFuture calculateAsync() {
return CompletableFuture.supplyAsync(() -> {
// 模拟一个耗时操作
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, CompletableFuture!";
});
}
}
在上面的示例中,calculateAsync
方法返回一个CompletableFuture对象,该对象会在异步线程中执行耗时操作,并返回结果。在主线程中,我们可以注册一个回调函数(使用thenAccept
方法),当异步任务完成时,会自动调用该回调函数并传入结果。在主线程中,我们还可以继续执行其他操作,而不需要等待异步任务完成。最后,我们可以使用get
方法阻塞主线程,直到异步任务完成。