前言
以前需要异步执行一个任务时,一般是用Thread或者线程池Executor去创建。如果需要返回值,则是调用Executor.submit获取Future。但是多个线程存在依赖组合,我们又能怎么办?可使用同步组件CountDownLatch、CyclicBarrier等;其实有简单的方法,就是用CompletableFuture
- 线程任务的创建
- 线程任务的串行执行
- 线程任务的并行执行
- 处理任务结果和异常
- 多任务的简单组合
- 取消执行线程任务
- 任务结果的获取和完成与否判断
1 创建异步线程任务
根据supplier创建CompletableFuture任务
根据runnable创建CompletableFuture任务
常量值作为CompletableFuture返回
2 线程串行执行

任务完成则运行action,不关心上一个任务的结果,无返回值
任务完成则运行action,依赖上一个任务的结果,无返回值
任务完成则运行fn,依赖上一个任务的结果,有返回值
thenCompose - 任务完成则运行fn,依赖上一个任务的结果,有返回值
- 类似thenApply(区别是thenCompose的返回值是CompletionStage,thenApply则是返回 U),提供该方法为了和其他CompletableFuture任务更好地配套组合使用
3 线程并行执行

两个CompletableFuture[并行]执行完,然后执行action,不依赖上两个任务的结果,无返回值
两个CompletableFuture[并行]执行完,然后执行action,依赖上两个任务的结果,无返回值
两个CompletableFuture[并行]执行完,然后执行action,依赖上两个任务的结果,有返回值
4 线程并行执行,谁先执行完则谁触发下一任务(二者选其最快)

上一个任务或者other任务完成, 运行action,不依赖前一任务的结果,无返回值
上一个任务或者other任务完成, 运行action,依赖最先完成任务的结果,无返回值
上一个任务或者other任务完成, 运行fn,依赖最先完成任务的结果,有返回值
5 处理任务结果或者异常
exceptionally-处理异常

- 如果之前的处理环节有异常问题,则会触发exceptionally的调用相当于 try...catch
- 使用示例
handle-任务完成或者异常时运行fn,返回值为fn的返回
- 相比exceptionally而言,即可处理上一环节的异常也可以处理其正常返回值
whenComplete-任务完成或者异常时运行action,有返回值
- whenComplete与handle的区别在于,它不参与返回结果的处理,把它当成监听器即可
- 即使异常被处理,在CompletableFuture外层,异常也会再次复现
- 使用whenCompleteAsync时,返回结果则需要考虑多线程操作问题,毕竟会出现两个线程同时操作一个结果
6 多个任务的简单组合


7 取消执行线程任务
8 任务的获取和完成与否判断
文章转载自公众号:潜行前行