图片分享功能网站开发,太原做推广的公司,工业设计网站设计,网站开发分为哪几块Java8实战-总结51 CompletableFuture#xff1a;组合式异步编程响应 CompletableFuture 的 completion 事件付诸实践 小结 新的日期和时间AP CompletableFuture#xff1a;组合式异步编程
响应 CompletableFuture 的 completion 事件
付诸实践
现在通过randomDelay方法模拟… Java8实战-总结51 CompletableFuture组合式异步编程响应 CompletableFuture 的 completion 事件付诸实践 小结 新的日期和时间AP CompletableFuture组合式异步编程
响应 CompletableFuture 的 completion 事件
付诸实践
现在通过randomDelay方法模拟远程方法调用产生一个介于0.5秒到2.5秒的随机延迟不再使用恒定1秒的延迟值。下面的代码清单应用了这一改变执行这段代码你会看到不同商店的价格不再像之前那样总是在一个时刻返回而是随着商店折扣价格返回的顺序逐一地打印输出。为了让这一改变的效果更加明显我们对代码进行了微调在输出中打印每个价格计算所消耗的时间
long start System.nanoTime();
CompletableFuture[] futures findPricesStream(myPhone27S).map(f - f.thenAccept(s - System.out.println(s (done in ((System.nanoTime() - start) / 1_000_000) msecs)))) .toArray(size - new CompletableFuture[size]); CompletableFuture.allOf(futures).join(); System.out.println(All shops have now responded in ((System.nanoTime() - start) / 1_000_000) msecs); 运行这段代码所产生的输出如下
BuyItAll price is 184.74 (done in 2005 msecs)
MyFavoriteShop price is 192.72 (done in 2157 msecs)
LetsSaveBig price is 135.58 (done in 3301 msecs)
ShopEasy price is 167.28 (done in 3869 msecs)
BestPrice price is 110.93 (done in 4188 msecs)
All shops have now responded in 4188 msecs 由于随机延迟的效果第一次价格查询比最慢的查询要快两倍多。
小结
这部分的主要内容如下
执行比较耗时的操作时尤其是那些依赖一个或多个远程服务的操作使用异步任务可以改善程序的性能加快程序的响应速度。应该尽可能地为客户提供异步API。使用CompletableFuture类提供的特性能够轻松地实现这一目标。CompletableFuture类还提供了异常管理的机制让你有机会抛出/管理异步任务执行中发生的异常。将同步API的调用封装到一个CompletableFuture中你能够以异步的方式使用其结果。如果异步任务之间相互独立或者它们之间某一些的结果是另一些的输入你可以将这异步任务构造或者合并成一个。你可以为CompletableFuture注册一个回调函数在Future执行完毕或者它们计算的结果可用时针对性地执行一些程序。你可以决定在什么时候结束程序的运行是等待由CompletableFuture对象构成的列表中所有的对象都执行完毕还是只要其中任何一个首先完成就中止程序的运行。
新的日期和时间AP
Java的API提供了很多有用的组件能帮助你构建复杂的应用。不过Java API也不总是完美的。大多数有经验的程序员都会赞同Java 8之前的库对日期和时间的支持就非常不理想。然而也不用太担心Java 8中引入全新的日期和时间API就是要解决这一问题。
在Java 1.0中对日期和时间的支持只能依赖java.util.Date类。正如类名所表达的这个类无法表示日期只能以毫秒的精度表示时间。更糟糕的是它的易用性由于某些原因未知的设计决策这个类的易用性被深深地损害了比如年份的起始选择是1900年月份的起始从0开始。这意味着如果你想要用Date表示Java 8的发布日期即2014年3月18日需要创建下面这样的Date实例
Date date new Date(114, 2, 18); 它的打印输出效果为
Tue Mar 18 00:00:00 CET 2014看起来不那么直观。此外甚至Date类的toString方法返回的字符串也容易误导人。以我们的例子而言它的返回值中甚至还包含了JVM的默认时区CET即中欧时间Central Europe Time。但这并不表示Date类在任何方面支持时区。
随着Java 1.0退出历史舞台Date类的种种问题和限制几乎一扫而光但很明显这些历史旧账如果不牺牲前向兼容性是无法解决的。所以在Java 1.1中Date类中的很多方法被废弃了取而代之的是java.util.Calendar类。很不幸Calendar类也有类似的问题和设计缺陷导致使用这些方法写出的代码非常容易出错。比如月份依旧是从0开始计算不过至少Calendar类拿掉了由1900年开始计算年份这一设计。更糟的是同时存在Date和Calendar这两个类也增加了程序员的困惑。到底该使用哪一个类呢此外有的特性只在某一个类有提供比如用于以语言无关方式格式化和解析日期或时间的DateFormat方法就只在Date类里有。
DateFormat方法也有它自己的问题。比如它不是线程安全的。这意味着两个线程如果尝试使用同一个formatter解析日期你可能会得到无法预期的结果。
所有这些缺陷和不一致导致用户们转投第三方的日期和时间库比如Joda-Time。为了解决这些问题Oracle决定在原生的Java API中提供高质量的日期和时间支持。所以你会看到Java 8在java.time包中整合了很多Joda-Time的特性。
下面会探索新的日期和时间API所提供的新特性。首先从最基本的用例入手比如创建同时适合人与机器的日期和时间逐渐转入到日期和时间API更高级的一些应用比如操纵、解析、打印输出日期时间对象使用不同的时区和年历。