java异步多线程之CompletableFuture
java异步多线程之CompletableFuture
继spring@Async之后,以java8的CompletableFuture实现异步多线程任务执行,代码更加优雅。
一、CompletableFuture概述
1.提供了一种观察者模式类似的机制,可以让任务执行完成后通知监听的一方。
2.可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果。
3.实现了CompletionStage接口: 代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段。
它是Future的功能增强版,减少阻塞和轮询,可以传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法。
二、CompletableFuture作用
可以为主线程开一个分支任务(线程),专门为主线程处理耗时和费力的复杂业务。
三、核心的四个静态方法
runAsync(无返回值):
public static CompletableFuture<Void> runAsync(Runnable runnable)
public static CompletableFuture<Void> runAsync(Runnable runnable,Executor executor)
supplyAsync(有返回值):
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,Executor executor)
四、案例
//手动创建线程池,避免创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。
ExecutorService executorService = Executors.newFixedThreadPool(2);
public List<PartVo> PartVo() throws Exception {
long start=System.currentTimeMillis();
CompletableFuture<List<PartVo>> partVoInfo=CompletableFuture.supplyAsync(()-> testTask.getPartList(),executorService);
CompletableFuture<List<CategoryVo>> listCompletableFuture = CompletableFuture.supplyAsync(() -> testTask.getCategoryList(),executorService);
//一个新的CompletableFuture,当所有给定的Completable Future完成时完成
CompletableFuture<Void> voidCompletableFuture = CompletableFuture.allOf(partVoInfo, listCompletableFuture);
//获取结果
List<PartVo> partsList = partVoInfo.get();
//获取结果
List<CategoryVo> categoryList = listCompletableFuture.get();
long end = System.currentTimeMillis();
System.out.println("任务全部完成,总耗时:" + (end - start) + "毫秒");
return partsList;
}
五、结果
使用异步多线程解决耗时和费力的复杂业务需要的时间
不使用异步多线程解决耗时和费力的复杂业务需要的时间
更多推荐
所有评论(0)