欢迎来到天天文库
浏览记录
ID:40557308
大小:45.46 KB
页数:19页
时间:2019-08-04
《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
此文档下载收益归作者所有