Future
-
基本概念:
Future
是Java 5引入的一个接口,用来表示一个异步计算的结果。- 你可以提交一个任务给
ExecutorService
,它会返回一个Future
对象,这个对象表示任务的执行情况。
-
主要方法:
get()
:这个方法会阻塞当前线程,直到异步任务完成并返回结果。如果任务还没完成,调用这个方法的线程会一直等着。isDone()
:这个方法会返回一个布尔值,告诉你任务是否已经完成。cancel()
:这个方法可以用来取消任务,如果任务还没开始或者正在进行中,可以尝试取消它。
-
局限性:
Future
的主要局限在于它的get()
方法会阻塞,这意味着你不能在任务完成之前继续做其他事情。- 它也没有很好的方法来处理任务完成后的操作,比如继续执行其他任务或者处理结果。
CompletableFuture
-
基本概念:
CompletableFuture
是Java 8引入的一个类,它实现了Future
接口,并且提供了更多强大的功能,用来处理异步编程。- 它不仅可以表示一个异步任务的结果,还可以设置回调函数,当任务完成时自动执行这些回调。
-
主要方法:
complete()
: 手动完成一个任务,并设置它的结果。thenApply()
: 当任务完成后,继续执行一个函数,并将任务的结果作为这个函数的输入。thenAccept()
: 当任务完成后,执行一个消费型函数,不返回结果。thenRun()
: 当任务完成后,执行一个Runnable,不关心任务的结果。exceptionally()
: 当任务执行出错时,执行一个函数来处理异常。allOf()
和anyOf()
: 用来组合多个CompletableFuture
,比如等待所有任务完成或任意一个任务完成。
-
优势:
- 非阻塞:不像
Future
的get()
方法那样阻塞,CompletableFuture
允许你设置回调函数,这样你可以在任务完成时自动执行后续操作。 - 链式操作:你可以链式调用多个方法,表示一系列的异步操作,这让代码更简洁、更易读。
- 组合任务:你可以很容易地组合多个异步任务,比如等待所有任务完成或任意一个任务完成,然后继续执行其他操作。
- 非阻塞:不像
总结
- Future:适用于简单的异步任务,但它的
get()
方法会阻塞,使得处理异步任务变得困难。 - CompletableFuture:提供了更丰富的功能,允许你更灵活地处理异步任务,包括非阻塞操作、链式操作和任务组合。