java 异步调用接口_Java接口异步调用[通俗易懂]

java 异步调用接口_Java接口异步调用[通俗易懂]java接口调用从调用方式上可以分为3类:同步调用,异步调用,回调;同步调用基本不用说了,它是一种阻塞式的调用,就是A方法中直接调用方法B,从上往下依次执行。今天来说说异步调用。什么是异步调用?我的理解就是在方法A中调用方法B,但是方法B很耗时,如果是同步调用的话会等方法B执行完成后才往下执行,如果异步的话就是我调用了方法B,它给我个返回值证明它已接受调用,但是它并没有完成任务,而我就继续往下执行…

大家好,又见面了,我是你们的朋友全栈君。

java接口调用从调用方式上可以分为3类:同步调用,异步调用,回调;同步调用基本不用说了,它是一种阻塞式的调用,就是A方法中直接调用方法B,从上往下依次执行。今天来说说异步调用。

什么是异步调用?

我的理解就是在方法A中调用方法B,但是方法B很耗时,如果是同步调用的话会等方法B执行完成后才往下执行,如果异步的话就是我调用了方法B,它给我个返回值证明它已接受调用,但是它并没有完成任务,而我就继续往下执行。可能有表达不当的地方,欢迎指正。

再用一个生活中的例子吧:

异步调用就是你 喊 你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你就去做别的了。

同步调用就是你 喊 你朋友吃饭 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你们一起去。

异步调用有哪些角色?

调用者

取货凭证

真实数据

一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据.

连结调用者和真实数据之间的桥梁是取货凭证.我们先来看它的实现:

public class FutureTicket{

private Object data = null;

private boolean completed = false;

public synchronized void makeRealData(){

if(this.complited) return;

//获取数据的耗时操作.这里用Sleep代替

try{

Thread.sleep(10000);

}catch(Throwable t){}

this.data = “返回的数据内容”;

this.completed = true;

notifyAll();

}

public synchronized Object getData(){

while(!this.completed)){

try{

wait();

}catch(Throwable t){}

}

return this.data;

}

public boolean isCompleted(){

return this.completed;

}

}

为了简单化说明(不把它们的关系开得复杂),这里用Objectb代替了真实数据.而真实的实现中我们应该把makeData放在一个真实数据的类中,然后提供一个方法返回真实数据.这样对于真实数据的处理和取货凭证解耦.

对于这个取货凭证,调用者的如何调用是异步调用的关键:

publc class Requester{

public FutureTicket request(){

final FutureTicket ft = new FutureTicket();

//在新线程中调用耗时操作

new Thread(){

public void run(){

ft.makeRealData();

}

}.start();

return ft;

}

}

在新线程中启动耗时操作后,不等待线程的完成立即返回提货单.

然后调用者可以根据ft.isCompleted()来调用getData()获取真实数据.当然对ft.isCompleted()测试可以按规定时间间隔轮巡(极低级的方案),也可以在条件不满足时wait(),然后等待makeData的notifyAll();这样你就完成了一个用JAVA模拟的异步操作.链接中还有后续改进操作,但本文只想阐述什么是异步调用,所以不加以展示,有兴趣的可以访问该链接。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157331.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 华为EC6108V9C/ E6108V9强刷固件及教程

    华为EC6108V9C/ E6108V9强刷固件及教程电信移动华为 EC6108V9C E6108V9 强刷固件刷机包及教程固件特点 1 调出原厂固件屏蔽的 wifi 开放原厂固件屏蔽的市场安装和 u 盘安装 apk 2 无开机广告 无系统更新 不在被强制升级 修改 dns 三网通用 3 大量精简内置的没用的软件 运行速度提升 30 以上 多出大量的存储空间 4 去除应用安装限制 实现自由安装软件 5 支持开机自启动 开机密码锁 儿童应用锁 应用隐藏 开机自动进入 HDMI 等各种花式功能 6 固件压缩包有刷机教程 解压获取 1 U 盘选择

    2025年6月14日
    17
  • java工作流activity_activity 工作流学习(一)

    java工作流activity_activity 工作流学习(一)启动流程实例什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系)为了演示:在流程图中指定办理人是谁,现在是写死的,表示只能张三能提交请假申请。后面会讲解如何动态指定。//根据流程定义的Id启动一个流程实例(操作ACT_RU_EXECUTION、ACT_RU_TASK、ACT_HI_PROCINST、ACT_HI_ACTINST、ACT_HI…

    2022年6月9日
    57
  • 廖雪峰Python练习题

    廖雪峰Python练习题今天主要学习了python中filter的用法。Python内建的filter()函数主要用于过滤序列,和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。做了两道练习题,第一道是用filter求素数。第二道是用filter()筛选出回数。@Pyt…

    2025年7月20日
    4
  • “备份集中的数据库备份与现有的数据库不同”解决方法「建议收藏」

    “备份集中的数据库备份与现有的数据库不同”解决方法「建议收藏」原文发布时间为:2010-09-16——来源于本人的百度文章[由搬家工具导入]最主要就是要在“选项”中选择“覆盖现有数据库”,否则就会出现“备份集中的数据库备份与现有的数据库”的问题。以前一直使用SQLServer2000,现在跟潮流都这么紧,而且制定要求使用SQLServer2005,就在现在的项目中使用它了。对于SQLServer2005,有几个地方是要注意的,比方在还原数据库…

    2022年4月30日
    50
  • IDEA左侧的project目录中,看不到项目的文件结构图,项目目录不见了

    IDEA左侧的project目录中,看不到项目的文件结构图,项目目录不见了

    2021年9月30日
    141
  • mount命令详解

    mount命令详解原文链接:https://blog.csdn.net/happy_teemo/article/details/80026906挂接命令(mount)首先,介绍一下挂接(mount)命令的使用方法,

    2022年7月2日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号