在以下示例方面,使用Future和Completable Future有什么区别。
我读到的主要用途之一是在将来可以使用.apply()来连接多种方法。
Future在将方法连接到method()内并在单独的线程中调用该方法(将其连接)时不是这种情况。
我发现他们两个都在做同一件事。有人可以解释吗?
class FutureExample {
static boolean method1() {
return true;
}
static boolean method2(boolean m) {
return m;
}
static boolean method() {
boolean v = method1();
return method2(v);
}
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(1); //initialize to 1 for stackoverflow question
Future<Boolean> future = service.submit(FutureExample::method);
}
}
VERSUS
class CompletableFutureExample {
static boolean method1() {
return true;
}
static boolean method2(boolean m) {
return m;
}
public static void main(String[] args) {
CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(CompletableFutureExample::method1).thenApply(CompletableFutureExample::method2);
}
}
答案 0 :(得分:1)
这种情况下的主要区别在于,您可以使用.compleate(T t)方法来完成Future单元。
thenAccept(Function f)
thenApply(...)
thenRun(...)
使用Future时,不会收到通知,而使用CompletableFuture则具有此可能性。
我希望我回答了你的问题。祝你有美好的一天。
答案 1 :(得分:0)
在第一种情况下(仅适用于Future
):
这两个方法始终在同一线程中执行,并且该线程被阻塞,直到两个功能都完成
没有异步异常处理
您无法轻松地组合/修改执行链:您始终需要为每种功能组合声明一个新方法
在此特定示例中,差异不明显。的真正力量
当您需要合并/合并不同异步调用的结果,处理整个链的异常,管理线程等时,会出现CompletableFuture
(或更笼统的CompletionStage
)。