持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,[点击查看活动详情]
上篇文章介绍了completableFuture的基础api是基于future的扩展,本篇文章来介绍completableFuture实现的另外一个接口CompletionStage,正是因为实现了这个接口才使得completableFuture比future更加强大的功能。
在介绍下面的方法我想先抛出一个结论以便于理解:
凡是有Async的都是异步执行且可指定线程池,大部分对应的有Async的方法就有对应的非异步的方法
- runAsync :类比线程池的execute,执行一个任务没有返回值。
创建了两个runAsync执行任务,可以看到返回的值是void,也就是没有返回,且第一个和第二个的执行线程名称区别,指定线程池使用的是自定义的线程执行,否则是使用默认的futureTask线程池执行。
- supplyAsync:类比线程池的submit,执行一个任务有返回值,也就是需要return。
- acceptEitherAsync:传入一个其他的completableFuture任务、和当前任务比较,返回执行较快任务的结果,无返回。
创建两个completableFuture任务,故意在其中一个任务休眠一秒,发现只会输出执行较快的那个任务,执行较慢的任务不会输出,执行结果如下图:
如果将休眠换到另外一个任务B,会发现输出变成了A,执行结果如下图:
上面需要注意的是我说的不会输出指的是acceptEitherAsync的输出语句只会输出执行较快的结果,但是执行较慢的任务在睡眠结束只会还是会继续执行的,但是由于主线程已经执行结束所以会导致执行较慢的任务输出语句不输出,只需要在主线程休眠几秒即可。
- applyToEitherAsync : 传入一个其他的completableFuture任务、和当前任务比较,返回执行较快任务的结果,有返回,和acceptEitherAsync类似只不过是多了一个返回值。
- exceptionally : 当之前的任务执行发送异常将当前异常当做参数执行当前步骤。
当一个任务执行过程中发送异常的时候会自动进入到exceptionally阶段,可以对异常情况做一些处理,如下图:
可以发现程序并没有因为异常中断,而是正常执行,且返回了异常对应的结果,这个api也是非常常用也很实用。
- handleAsync : 不管之前的任务是否发生异常,都将上个任务和异常当做参数传入当前任务
如下图,如果当前任务随机数大于5则抛出异常,否则返回随机数,不管是否抛出异常,都会进入handleAsync阶段,可以对异常或者结果进行判断在进行下一步业务逻辑。