当前位置: 首页 > news >正文

微信小程序怎拼做搬家网站东莞建网站公司

微信小程序怎拼做搬家网站,东莞建网站公司,湛江seo哪家好,做网站需要公司在Java 8中全面研究了CompletableFuture API之后#xff0c;我们准备编写一个简单的Web搜寻器。 我们已经使用ExecutorCompletionService #xff0c; Guava ListenableFuture和Scala / Akka解决了类似的问题。 我选择了相同的问题#xff0c;以便轻松比较方法和实现技术。 … 在Java 8中全面研究了CompletableFuture API之后我们准备编写一个简单的Web搜寻器。 我们已经使用ExecutorCompletionService Guava ListenableFuture和Scala / Akka解决了类似的问题。 我选择了相同的问题以便轻松比较方法和实现技术。 首先我们将定义一个简单的阻止方法来下载单个URL的内容 private String downloadSite(final String site) {try {log.debug(Downloading {}, site);final String res IOUtils.toString(new URL(http:// site), UTF_8);log.debug(Done {}, site);return res;} catch (IOException e) {throw Throwables.propagate(e);} } 没有什么花哨。 稍后将为线程池内的其他站点调用此方法。 另一种方法将String解析为XML Document 让我省略实现没有人愿意看一下它 private Document parse(String xml) //... 最后我们算法的核心是以Document为输入的每个网站的功能计算相关性 。 就像上面我们不在乎实现一样只有签名很重要 private CompletableFutureDouble calculateRelevance(Document doc) //... 让我们把所有的东西放在一起。 抓取到一份网站列表后我们的搜寻器应开始异步并发下载每个网站的内容。 然后将每个下载HTML字符串解析为XML Document并随后计算相关性 。 最后我们采用所有计算出的相关性指标并找到最大的指标。 当您意识到下载内容和计算相关性都是异步的返回CompletableFuture 并且我们绝对不想阻塞或忙于等待时这听起来很简单。 这是第一部分 ExecutorService executor Executors.newFixedThreadPool(4);ListString topSites Arrays.asList(www.google.com, www.youtube.com, www.yahoo.com, www.msn.com );ListCompletableFutureDouble relevanceFutures topSites.stream().map(site - CompletableFuture.supplyAsync(() - downloadSite(site), executor)).map(contentFuture - contentFuture.thenApply(this::parse)).map(docFuture - docFuture.thenCompose(this::calculateRelevance)).collect(Collectors.CompletableFutureDoubletoList()); 实际上这里有很多事情。 定义要爬网的线程池和站点是显而易见的。 但是这种链式表达式计算relevanceFutures 。 最后的map()和collect()的序列具有很强的描述性。 从网站列表开始我们通过将异步任务 downloadSite() 提交到线程池中将每个网站 String 转换为CompletableFutureString 。 因此我们有了CompletableFutureString 。 我们继续对其进行转换这一次在每个parse()上都应用了parse()方法。 请记住当基础将来完成时 thenApply()将调用提供的lambda并立即返回CompletableFutureDocument 。 第三个也是最后一个转换步骤是使用calculateRelevance()将输入列表中的每个CompletableFutureDocument组成。 请注意 calculateRelevance()返回CompletableFutureDouble而不是Double 因此我们使用thenCompose()而不是thenApply() 。 经过这么多阶段我们终于collect()了CompletableFutureDouble 。 现在我们想对所有结果进行一些计算。 我们有一份期货清单我们想知道所有这些期货最后一个何时完成。 当然我们可以在每个将来注册完成回调并使用CountDownLatch阻止直到调用所有回调。 我对此很懒让我们利用现有的CompletableFuture.allOf() 。 不幸的是它有两个小缺点-使用vararg而不是Collection 并且不返回将来的合计结果而是返回Void 。 通过汇总结果我的意思是如果我们提供ListCompletableFutureDouble该方法应返回CompletableFutureListDouble 而不是CompletableFutureVoid 幸运的是使用一些粘合代码很容易修复 private static T CompletableFutureListT sequence(ListCompletableFutureT futures) {CompletableFutureVoid allDoneFuture CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));return allDoneFuture.thenApply(v -futures.stream().map(future - future.join()).collect(Collectors.TtoList())); } 仔细观察sequence()参数和返回类型。 实现非常简单诀窍是使用现有的allOf()但是当allDoneFuture完成时这意味着所有基础期货都已完成只需遍历所有期货并在每个期货上进行join() 阻塞等待。 但是由于目前所有期货都已完成因此保证此电话不会被阻止 有了这种实用程序我们终于可以完成我们的任务 CompletableFutureListDouble allDone sequence(relevanceFutures); CompletableFutureOptionalDouble maxRelevance allDone.thenApply(relevances -relevances.stream().mapToDouble(Double::valueOf).max() ); 这很容易–当allDone完成后应用我们的功能即可计算整个集合中的最大相关性。 maxRelevance仍然是未来。 到JVM到达这一行时可能尚未下载任何网站。 但是我们将业务逻辑封装在期货之上并以事件驱动的方式将其堆叠。 代码保持可读性不带lambda和普通Future的版本至少要长两倍但避免阻塞主线程。 当然 allDone也可以作为中间步骤我们可以对其进行进一步的转换而实际上还没有结果。 缺点 Java 8中的CompletableFuture是向前迈出的一大步。 从对异步任务的细微抽象到功能完善功能丰富的实用程序。 但是在玩了几天之后我发现了一些小缺点 返回前面提到的CompletableFutureVoid CompletableFuture.allOf() 。 我认为可以这样说如果我通过一组期货并希望等待所有这些期货那么我也想在它们容易到达时提取结果。 使用CompletableFuture.anyOf()甚至更糟。 如果我等待任何期货完成那么我将无法想象传递不同类型的期货比如说CompletableFutureCar和CompletableFutureRestaurant 。 如果我不在乎哪个先完成那么我该如何处理返回类型 通常您将传递同类期货的集合例如CompletableFutureCar 然后anyOf()可以简单地返回该类型的期货而不是再次代替CompletableFutureVoid 。 混合可设置和可听的抽象。 在番石榴中有ListenableFuture和SettableFuture扩展。 ListenableFuture允许注册回调而SettableFuture增加了从任意线程和上下文设置解析将来值的可能性。 CompletableFuture与SettableFuture等效但是没有等效于ListenableFuture受限版本。 为什么会出问题呢 如果API返回CompletableFuture 然后有两个线程等待它完成这没什么问题那么其中一个线程可以解决此将来并唤醒其他线程而只有API实现才可以执行此操作。 但是当API尝试在以后解决将来时对complete()调用将被忽略。 它可能会导致真正令人讨厌的错误在Guava中将这两个责任分开可以避免。 在JDK中 CompletableFuture被忽略。 未对ExecutorService进行改装以返回CompletableFuture 。 从字面上看 CompletableFuture在JDK中未引用任何地方。 这是一个非常有用的类与Future向下兼容但在标准库中并未真正推广。 膨胀的API总共50种方法大多数为三种形式。 拆分可设置和可听 见上文将有所帮助。 同样恕我直言诸如runAfterBoth()或runAfterEither()类的某些方法runAfterBoth()并不属于任何CompletableFuture 。 fast.runAfterBoth(predictable, ...)和predictable.runAfterBoth(fast, ...)之间有区别吗 否但是API支持两者之一。 实际上我相信runAfterBoth(fast, predictable, ...)更好地表达我的意图。 CompletableFuture.getNow(T)应该使用SupplierT而不是原始引用。 在下面的示例中无论将来是否完成 expensiveAlternative()始终是代码 future.getNow(expensiveAlternative()); 但是我们可以轻松地调整此行为我知道这里有一个小的竞争条件但是原始的getNow也可以这种方式工作 public static T T getNow(CompletableFutureT future,SupplierT valueIfAbsent) throws ExecutionException, InterruptedException {if (future.isDone()) {return future.get();} else {return valueIfAbsent.get();} } 使用此实用程序方法我们可以避免在不需要时调用expensiveAlternative() getNow(future, () - expensiveAlternative()); //or: getNow(future, this::expensiveAlternative); 总体而言 CompletableFuture是我们JDK腰带中的一款出色的新工具。 较小的API问题有时由于有限的类型推断而导致语法过于冗长这不会阻止您使用它。 至少它为更好的抽象和更健壮的代码奠定了坚实的基础。 参考 Java 8我们的JCG合作伙伴 Tomasz Nurkiewicz在Java和社区博客上的实践中的CompletableFuture 。 翻译自: https://www.javacodegeeks.com/2013/05/java-8-completablefuture-in-action.html
http://www.pierceye.com/news/159176/

相关文章:

  • 有没有网站开发团队郑州网站制作电话
  • 网站怎么做登陆免费虚拟机
  • 中国移动网站备案管理系统不能用科普网站建设的支持力度
  • 谁教我做啊谁会做网站啊企业网站模板seo
  • 自己建立一个网站需要什么wordpress 平衡插件
  • 邯郸手机建站价格青海网站开发 建设
  • 苏州 手机网站免费个人简历模板电子版可填写
  • 永州内部网站建设公司wordpress 模版开发
  • 云建站优势门户网站如何建设方案
  • 网站建设收费标准不一湖州网站开发公司
  • asp制作网站青岛建网站公司
  • 人人商城程序做的网站打不开百度网盘客户端下载
  • 医疗器械注册证查询网站优化推广服务
  • 网站制作网页做简单的网站首页
  • 怎样做网站上的语种链接泰安网络犯罪案件
  • soap公司网站建设国家游戏网站
  • 网站可以用什么做安阳区号是什么
  • 网站建设实战李静如何建设网站的能力
  • 威海 网站开发做家具的网站有哪些
  • 宁波网站建设公司怎么报价网页打开速度慢的解决方法
  • 有趣的网站有哪些推荐关键词没有排名的网站怎么做
  • 昆山网站制作哪家强海淀区企业网络公司
  • 北京网站制建设公司永兴县网站建设服务商
  • 嘉兴做网站优化公司江阴网站优化公司
  • dz可以做旅游网站吗wordpress 4.1.1 漏洞
  • 谷歌网站地图生成福州便民网免费发布信息
  • 最新军事战争新闻超级优化大师
  • 好的网站建设公司排名网站建设 交易保障
  • 怎么查看网站外链效果代理注册公司有什么风险
  • 西安网站漏洞免费自动生成小程序