面试题答案
一键面试功能区别
- Future:提供了基本的异步任务执行和结果获取能力。只能通过
get()
方法阻塞等待任务完成获取结果,或通过isDone()
方法轮询任务是否完成。不支持任务完成时的回调处理,也难以处理多个异步任务的组合。 - CompletableFuture:功能更强大,不仅能完成Future的基本功能,还支持任务完成时的回调,如
thenApply
、thenAccept
、thenRun
等方法。支持多个异步任务的组合操作,如thenCombine
、allOf
、anyOf
等,可更灵活地处理复杂的异步逻辑。
使用场景区别
- Future:适用于简单的异步任务场景,对结果获取方式要求不高,只需简单阻塞获取结果即可,例如在一些后台数据加载任务,不关心任务完成后的额外处理。
- CompletableFuture:适用于复杂的异步任务场景,需要对任务完成后的结果进行处理,或需要组合多个异步任务的情况,如在微服务架构中,需要聚合多个服务的异步返回结果。
异步结果获取方式区别
- Future:通过
get()
方法获取结果时会阻塞当前线程,直到任务完成;get(long timeout, TimeUnit unit)
方法可设置超时时间,超时则抛出异常。也可结合isDone()
方法轮询判断任务是否完成,避免长时间阻塞,但效率较低。 - CompletableFuture:除了可以使用
get()
方法阻塞获取结果外,更推荐使用回调方式处理结果,如thenApply
方法会在任务完成后,将结果作为参数传递给回调函数,且回调函数在任务完成线程池中执行,不会阻塞主线程,极大提高了异步处理的灵活性和效率。