java中的异步处理和Feature接口(一)

2023-11-11

背景介绍

想象这样一个场景:你可能希望为你的法国客户提供指定主题的热点报道。为实现这一功能,你需要向 谷歌或者Twitter的API请求所有语言中针对该主题最热门的评论,可能还需要依据你的内部算法 对它们的相关性进行排序。之后,你可能还需要使用谷歌的翻译服务把它们翻译成法语,甚至 利用谷歌地图服务定位出评论作者的位置信息,最终将所有这些信息聚集起来,呈现在你的网站上。

典型的“混聚”式应用

在这种“混聚”应用式的应用中,我们的应用可能会有以下两种需求:

  1. 由于我们调用的许多都是外部提供的接口,极有可能出现由于某些外部网络服务发生响应慢的情况。在这种情况下,我们可能希望依旧能为用户提供部分信息,比如提供带问号标记的通用地图,以文本的方式显示信息,而不是呆呆地显示一片空白屏幕,直到地图服务器返回结果或者超时退出。

  2. 要实现类似的服务,你需要与互联网上的多个Web服务通信。可是,你并不希望因为等待某 些服务的响应,阻塞应用程序的运行,浪费数十亿宝贵的CPU时钟周期。比如,不要因为等待 Facebook的数据,暂停对来自Twitter的数据处理。

以上两种场景体现了多任务程序设计的另一面。如果你的主要目标是在同一个CPU上执 行几个松耦合的任务,充分利用CPU的核,让其足够忙碌,从而最大化程序的吞吐量,那么你其实真正想做的是避免因为等待远程服务的返回,或者对数据库的查询,而阻塞线程的执行, 浪费宝贵的计算资源,因为这种等待的时间很可能相当长。这时就需要用到异步处理,在Java 5中提供的Future接口和在Java 8 中的新版实现CompletableFuture,就是处理这种情况的利器。

Feature接口

Future接口在Java 5中被引入,设计初衷是对将来某个时刻会发生的结果进行建模。它建模 了一种异步计算,返回一个执行运算结果的引用,当运算结束后,这个引用被返回给调用方。在 Future中触发那些潜在耗时的操作把调用线程解放出来,让它能继续执行其他有价值的工作, 不再需要呆呆等待耗时的操作完成。

Feature接口和Tread的区别

Future的优点是它比 更底层的Thread更易用。要使用Future,通常你只需要将耗时的操作封装在一个Callable对 象中,再将它提交给ExecutorService,就万事大吉了。

Feature接口示例

下面是一个Feature的demo示例:

    public void testFeature() {
        //创建Executor- Service,通 过它你可以 向线程池提 交任务
        ExecutorService executor = Executors.newCachedThreadPool();
        //向Executor- Service提交一个 Callable对象
        final Future<Double> futureRate = executor.submit(new Callable<Double>() {
            public Double call() {
                //以异步方式在新的线程中执行耗时的操作
                return doSomeLongComputation();
            }
        });
        //异步操作进行的同时你可以做其他的事情
        doSomethingElse();

        try {
            //获取异步操作的结果,如果最终被阻塞,无法得到结果,那么在最多等待1秒钟之后退出
            Double result = future.get(1, TimeUnit.SECONDS);
        } catch (ExecutionException e) {
            // 计算抛出一个异常
            e.printStackTrace();
        } catch (InterruptedException ie) { // 当前线程在等待过程中被中断
        } catch (TimeoutException te) { // 在Future对象完成之前超过已过期
        }
    }

使用Future以异步方式执行长时间的操作

如上图所示,这种编程方式让你的线程可以在ExecutorService以并发方式调 用另一个线程执行耗时操作的同时,去执行一些其他的任务。接着,如果你已经运行到没有异步 操作的结果就无法继续任何有意义的工作时,可以调用它的get方法去获取操作的结果。如果操 作已经完成,该方法会立刻返回操作的结果,否则它会阻塞你的线程,直到操作完成,返回相应 的结果。如果该长时间运行的操作永远不返回了会怎样?为了处理这种可能性,虽然Future提供了一个无需任何参数的get方法,我们还是推荐大家使用重 载版本的get方法,它接受一个超时的参数,通过它,你可以定义你的线程等待Future结果的最 长时间,从而无需永无止境的等待下去。

Feature接口的局限性

虽然Feature接口提供了方法来检测异步计算是否已经结束(使用 isDone方法),等待异步操作结束,以及获取计算的结果。但是这些特性还不足以让你编写简洁的并发代码。

我们可能还需要更多的特性来帮助我们写出更好异步代码,如:

  • 将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第 一个的结果。

  • 等待Future集合中的所有任务都完成。

  • 仅等待Future集合中最快结束的任务完成(有可能因为它们试图通过不同的方式计算同一个值),并返回它的结果。

  • 通过编程方式完成一个Future任务的执行(即以手工设定异步操作结果的方式)。

  • 应对Future的完成事件(即当Future的完成事件发生时会收到通知,并能使用Future

计算的结果进行下一步的操作,不只是简单地阻塞等待操作的结果)。

下一节我们将介绍新的CompletableFuture类(它实现了Future接口)如何利用Java 8 的新特性以更直观的方式将上述需求都变为可能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中的异步处理和Feature接口(一) 的相关文章

  • Firebase 查询 Or'ing whereEqualTo 以获得可能值的列表

    我见过之前针对早期版本的 Firebase 提出过这个问题 https stackoverflow com questions 26700924 query based on multiple where clauses in fireba
  • Hibernate OneToMany 关系是 PersistentBag 而不是 List

    我正在 javafx 中开发一个应用程序 它通过 RMI 与 EAR 连接 该 EAR 连接到 SQLServer DB 并使用 hibernate 映射 POJOS 这些 POJOS 包含双向 OneToMany 和 ManyToOne
  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • java“void”和“非void”构造函数

    我用 java 编写了这个简单的类 只是为了测试它的一些功能 public class class1 public static Integer value 0 public class1 da public int da class1 v
  • 如何解决错误:java.lang.ClassNotFoundException:io.netty.util.concurrent.GenericFutureListener?

    昨天我第一次尝试用 Java 制作 Prometheus 客户端 从 Python 开始 最后是 GoLang 是否找到示例 import io prometheus client Counter import io prometheus
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • getClassLoader().getResource() 返回 null

    我有这个测试应用程序 import java applet import java awt import java net URL public class Test extends Applet public void init URL
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • 在 Mac 上使用 JRE 打开 jar 文件

    我有一个 jar 文件 旨在通过命令行运行 我不打算在运行应用程序的机器上进行任何java开发 我的思考过程是 因此我应该只需要JRE而不是JDK 此外 JDK 大约是 JRE 的 4 倍 我不想下载它 在 Mac 上安装 JRE 时 它不
  • Java G1 GC 处理引用对象运行缓慢

    我已经在 J ava 上运行了计数器 它24小时工作 每秒点击通过100次左右 白天 GC 处理时间从 20 60 毫秒缓慢上升到 10000 60000 毫秒 然后下降到 20 60 毫秒 这种模式不时地重复 从 GC 日志中我发现 GC
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • java中的比较器链

    正在阅读Oracle 关于接口的 Java 教程 https docs oracle com javase tutorial java IandI createinterface html其中给出了一个例子Card 打牌 我试图理解接口中的
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • Java 9 中紧凑字符串和压缩字符串的区别

    有什么优点紧凑的字符串 http openjdk java net jeps 254JDK9 中的压缩字符串 压缩字符串 Java 6 和紧凑字符串 Java 9 都有相同的动机 字符串通常实际上是 Latin 1 因此浪费了一半的空间 和
  • 将隐藏(生物识别)数据附加到 pdf 上的数字签名

    我想知道是否可以使用 iText 我用于签名 或 Java 中的其他工具在 pdf 上添加生物识别数据 我会更好地解释一下 在手写板上签名时 我会收集签名信息 例如笔压 签名速度等 我想将这些信息 java中的变量 与pdf上的签名一起存储

随机推荐

  • 如何快速提高英飞凌单片机编译器 TASKING TriCore Eclipse IDE 编译速度

    1 前言 使用英飞凌单片机编译器 TASKING TriCore Eclipse IDE 开发编译时 想必感受最深刻的就是编译速度 那是非常慢了 如果是部分修改的源文件编译还好 不用等太久 而如果选择需要全部编译 那么这个时间就很长了 网上
  • Redis之父:我可不止是一只码农

    一年前我暂停了写代码后开始尝试写科幻小说时 以为这是两条完全不一样的路子 随着写的文字越来越多 不断的推倒重写那也是家常便饭了 我现在总算非常确定了 撸一个大系统和写一本小说本质上其实差不太多 它们之间那是非常相似的 这里我们允许 Anti
  • 敏捷25年:历史阶段与中坚力量

    本文管中窥豹 多有阙疑 但表达的脉络依然有价值 敏捷25年的历史阶段 若龙在渊 1993 2001 1993年 作为XP土壤的C3项目开始 同年 Scrum诞生 这一阶段是新方法论的探索阶段 不满现状的先驱们八仙过海 好比是某组织成立前的各
  • Spring framework 笔记

    文章目录 环境搭建 创建工程 添加maven依赖 快速开始 Spring控制反转 IOC 什么是SpringIOC 配置元数据 Xml Or Annotation XML配置方式 在一个配置文件中导入其他配置文件 Annotation配置方
  • Long和Integer相互转换

    目录 一 int和long互相转换 一 long转化为int 1 类型强制转换 2 利用BigDecimal强制转换 二 int转化为long 1 类型强制转换 2 利用BigDecimal强制转换 二 Long和Integer的互相转换
  • DAP数仓模型及数据集成过程说明

    科技飞速发展的时代 企业信息化建设会越来越完善 越来越体系化 当今数据时代背景下更加强调 重视数据的价值 以数据说话 通过数据为企业提升渠道转化率 改善企业产品 实现精准运营 为企业打造自助模式的数据分析成果 以数据驱动决策 数据分析 无论
  • Wordpress使用CloudFlare的CDN来加速网站(页面规则缓存设置教程

    wordpress博客使用CloudFlare的CDN来加速网站 页面规则缓存设置教程 此篇文章只讲wordpress站点使用CloudFlare CDN的页面规则教程 其他问题可在下方留言 我会一一回复 CloudFlare的CDN有一个
  • java使用itext生成pdf

    效果 maven依赖
  • 2023华为OD机试真题 Java【分割数组的最大差值】

    前言 本题使用Java解答 如果需要Python代码 请参考以下链接 点我 题目内容 我们现在有一个数组nums 需要对该数组进行分割 分割点可以是数组中的任何位置 将该数组分割成两个非空子数组 分别对子数组求和得到两个值 然后需要计算这两
  • python数值计算库教程,Scipy教程 - python数值计算库

    Introduction to Scipy SciPy函数库在NumPy库的基础上增加了众多的数学 科学以及工程计算中常用的库函数 例如线性代数 常微分方程数值求解 信号处理 图像处理 稀疏矩阵等等 涉及的领域众多 可以进行插值处理 信号滤
  • windows 版本 —— nvm-node版本控制

    一 nvm介绍及应用场景 nvm就是nodejs version manage 叫做nodejs 版本管理 而nodejs有很多版本 场景如下 1 而你手上开发的有多个项目又分别是不同的nodejs版本 咱们就可以用nvm轻松切换 2 假设
  • Qt:解决跨线程调用socket/IO类,导致报错的问题(socket notifiers cannot be enabled from another thread)

    Qt 解决跨线程调用socket IO类 导致报错的问题 socket notifiers cannot be enabled from another thread qt 异步线程调用io Jason188080501的博客 CSDN博客
  • 什么是伪共享(false sharing)

    今天看go的sync pool的代码 发现了一个比较陌生的名词 false sharing 之前没听说过 就去查了下 瞬间学到了 type poolLocal struct poolLocalInternal Prevents false
  • 保姆级教程手把手教你使用Arduino开发ESP32-1-搭建开发环境

    Arduino简单 易学 好用 资料全 特别适合小白新手上路 但是最初ARDUINO使用 ATMEL的51单片机同级别低配芯片 频率限制了我的想象力 ESP32频率高 价格低 内置蓝牙WIFI 支持语音识别LVGL等 是国产芯片中神一样的存
  • 函数劫持:即在一个函数运行之前把它劫持下来,添加我们想要的功能。

    当这个函数实际运行的时候 它已经不是原本的函数了 而是带上了被我们添加上去的功能 这也是我们常见的 钩子函数 的原理之一 示例 对内置函数consloe log 进行劫持 将console log函数的原有功能保存到变量log中 let l
  • 【Python】Pillow 库入门

    1 Pillow简介 1 1 PIL和Pillow PIL Python Imaging Library 是 Python 的第三方图像处理库 由于其功能丰富 API 简洁易用 因此深受好评 自 2011 年以来 由于 PIL 库更新缓慢
  • vcruntime140_1.dll丢失怎样修复,推荐4个vcruntime140_1.dll丢失的修复方法

    vcruntime140 1 dll文件是Microsoft Visual C Redistributable for Visual Studio 2015运行库的一部分 它是一个用于支持Visual C 构建的应用程序的系统文件 这个文件
  • Jmeter调试脚本之断言

    前言 jmeter中有个元件叫做断言 Assertion 它的作用和loadrunner中的检查点类似 用于检查测试中得到的响应数据等是否符合预期 用以保证性能测试过程中的数据交互与预期一致 使用断言的目的 在request的返回层面增加一
  • [Excel VBA]快捷键如何设置?

    本文翻译至 http itpro nikkeibp co jp atcl column 15 090100207 090100146 Application OnKey 键 函数名 执行Application对象的OnKey方法就可以设定宏
  • java中的异步处理和Feature接口(一)

    文章目录 背景介绍 Feature接口 Feature接口和Tread的区别 Feature接口示例 Feature接口的局限性 背景介绍 想象这样一个场景 你可能希望为你的法国客户提供指定主题的热点报道 为实现这一功能 你需要向 谷歌或者