处理非阻塞调用的传统方法是使用事件处理器,程序员为任务完成之后要出现的动作注册一个处理器。当然,如果下一个动作也是异步的,在它之后的下一个动作会在一个不同的事件处理器中。尽管程序员会认为“先做步骤1,然后是步骤2,再完成步骤3”,但实际上程序逻辑会分散到不同的处理器中。如果必须增加错误处理,情况会更糟糕。假设步骤2是“用户登录”。可能需要重复这个步骤,因为用户输入凭据时可能会出错。要尝试在一组事件处理器中实现这样一个控制流,或者想要理解所实现的这样一组事件处理器,会很有难度。
Java SE 8的CompletableFuture类提供了一种候选方法。与事件处理器不同,“可完成future”可以“组合”(composed)。
例如,假设我们希望从一个Web页面抽取所有链接来建立一个网络爬虫。下面假设有这样一个方法:
Web页面可用时这会生成这个页面的文本。如果方法:
生成一个HTML页面中的URL,可以调度当页面可用时再调用这个方法:
thenApply方法不会阻塞。它会返回另一个future。第一个future完成时,其结果会提供给getLinks方法,这个方法的返回值就是最终的结果。