Java CompletableFuture 详解

Java CompletableFuture 详解

ID:40557308

大小:45.46 KB

页数:19页

时间:2019-08-04

Java CompletableFuture 详解_第1页
Java CompletableFuture 详解_第2页
Java CompletableFuture 详解_第3页
Java CompletableFuture 详解_第4页
Java CompletableFuture 详解_第5页
资源描述:

《Java CompletableFuture 详解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Future是Java5添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。publicclassBasicFuture{publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{ExecutorServicees=Executors.newFixedThreadPool(10);Fut

2、uref=es.submit(()->{//长时间的异步计算//……//然后返回结果return100;});//while(!f.isDone())//;f.get();}}虽然Future以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背,轮询的方式又会耗费无谓的CPU资源,而且也不能及时地得到计算结果,为什么不能用观察者设计模式当计算结果完成及时通知监听者呢?很多语言,比如Node

3、.js,采用回调的方式实现异步编程。Java的一些框架,比如Netty,自己扩展了Java的 Future接口,提供了addListener等多个扩展方法:ChannelFuturefuture=bootstrap.connect(newInetSocketAddress(host,port));future.addListener(newChannelFutureListener(){@OverridepublicvoidoperationComplete(ChannelFuturefuture)throws

4、Exception{if(future.isSuccess()){//SUCCESS}else{//FAILURE}}});Googleguava也提供了通用的扩展Future:ListenableFuture、SettableFuture 以及辅助类Futures等,方便异步编程。finalStringname=...;inFlight.add(name);ListenableFuturefuture=service.query(name);future.addListener(newRunn

5、able(){publicvoidrun(){processedCount.incrementAndGet();inFlight.remove(name);lastProcessed.set(name);logger.info("Donewith{0}",name);}},executor);Scala也提供了简单易用且功能强大的Future/Promise异步编程模式。作为正统的Java类库,是不是应该做点什么,加强一下自身库的功能呢?在Java8中,新增加了一个包含50个方法左右的类: Completabl

6、eFuture,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果,并且提供了转换和组合CompletableFuture的方法。下面我们就看一看它的功能吧。主动完成计算CompletableFuture类实现了CompletionStage和Future接口,所以你还是可以像以前一样通过阻塞或者轮询的方式获得结果,尽管这种方式不推荐使用。publicTget()publicTget(longtimeout,TimeUnitunit)

7、publicTgetNow(TvalueIfAbsent)publicTjoin()getNow有点特殊,如果结果已经计算完则返回结果或者抛出异常,否则返回给定的valueIfAbsent值。join返回计算的结果或者抛出一个unchecked异常(CompletionException),它和get对抛出的异常的处理有些细微的区别,你可以运行下面的代码进行比较:CompletableFuturefuture=CompletableFuture.supplyAsync(()->{inti=1/

8、0;return100;});//future.join();future.get();尽管Future可以代表在另外的线程中执行的一段异步代码,但是你还是可以在本身线程中执行:publicstaticCompletableFuturecompute(){finalCompletableFuturefuture=newCompletableFutur

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。