在JAVA平台,实现异步调用的角色有如下三个角色:
 
调用者 取货凭证   真实数据
 
一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据.
 

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

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模拟的异步操作.

改进:
但这样的调用对于调用者来说仍然要继续控制线程操作.如果调用者是一个资深的程序员,这当然没有问题.但假如我们把对直接数据的处理委托给取货凭证来做.调用者直接规定对数据的操作,然后由取货凭证来调用规定的操作,这对于调用者是一个很好的解脱:

interface ProcessData{public void process(Onject data);
}public MyProcessData{public void process(Object data){//你不管什么时候起初数据data被获取了.//你只要规定如果获取到数据了如何处理System.out.println(data.toString() + "处理完成...........");//insert into dataBase?}
}

取货凭证在接收调用者请求获取数据时,要知道对获取的数据如何处理的方法:

public class FutureTicket{private Object data = null;private boolean completed = false;private ProcessData pd;public FutureTicket(ProcessData pd){this.pd = pd;}public synchronized void makeRealData(ProcessData pd){if(this.complited) return;//获取数据的耗时操作.这里用Sleep代替try{Thread.sleep(10000);}catch(Throwable t){}this.data = "返回的数据内容";this.completed = true;notifyAll();}public synchronized void putData(){while(!this.completed)){try{wait();}catch(Throwable t){}}//return this.data;//不用返回了,直接处理this.pd.process(this.data);// alert(?);}//这个方法也可以不要了.public boolean isCompleted(){return this.completed;}
}调用:final FutureTicket ft = new FutureTicket(new ProcessData());//在新线程中调用耗时操作new Thread(){public void run(){ft.makeRealData();}}.start();ft.putData();

OK,你现在可以抽烟,喝酒,泡妞.ft会为你完成所有的工作.

java实现异步调用实例相关推荐

  1. java http异步调用_HttpClient的异步调用,你造吗?

    一.前言 HttpClient提供了两种I/O模型:经典的java阻塞I/O模型和基于Java NIO的异步非阻塞事件驱动I/O模型. Java中的阻塞I/O是一种高效.便捷的I/O模型,非常适合并发 ...

  2. java同步异步调用_详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...

  3. Java线程异步调用使用的最好的方式

    一.异步调用方式分析 今天在写代码的时候,想要调用异步的操作,这里我是用的java8的流式异步调用,但是使用过程中呢,发现这个异步方式有两个方法,如下所示: 区别是一个 需要指定线程池,一个不需要. ...

  4. java thrift异步调用_thrift异步调用 - thrift-cob_style-tnonblockingserver - ItBoth

    [ thrift 在python中使用了 tornado和  twisted 来作为异步的webserive服务提供异步接口,自身并没有实现     twisted:         Generate ...

  5. unity调用普通java类_Unity中C#和Java的相互调用实例代码

    1.通过C#调用Java的方法: 在C#中添加调用的一些代码,利用Unity提供的一些接口实现调用Java! private const string JAVA_CLASS_Name = " ...

  6. java 多异步调用_java 异步调用与多线程

    异步与多线程的区别 一.异步和多线程有什么区别?其实,异步是目的,而多 线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作 就没有必要异步了),可以继续自顾 ...

  7. java多线程异步调用别的系统接口代码_60 多个实例讲解,彻底搞懂 Java 多线程!

    ​JAVA 最难学的部分是哪里?很多朋友都会说:「 java 多线程 」. 随着业务量和数据的增加,企业不可避免地会使用多线程的方式处理数据.在 Java 职位的面试中,多线程也是必考的高阶知识点之一 ...

  8. java多线程异步调用别的系统接口代码_抢先准备,40个 Java 多线程面试题及答案大汇总!...

    ↑↑↑点上方蓝字关注并标⭐「IT技术思维」 一起培养顶尖技术思维 来源:程序员共成长(id:finishbug) 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有 ...

  9. java 连接池实例_功能完善的Java连接池调用实例

    /** * Title: ConnectPool.java * Description: 连接池管理器 * Copyright: Copyright © 2002/12/25 * Company: * ...

最新文章

  1. 轻量函数式 JavaScript:八、列表操作
  2. 结构体内指针数组调用_指针的这些技巧你都掌握了吗
  3. 中文Ubuntu主目录下的文档文件夹改回英文
  4. 通过继承来实现注解方式的属性注入
  5. Vue实战:音乐播放器(一) 页面效果
  6. kali 破解压缩包密码
  7. Lagrange’s Mean Value Theorem - 拉格朗日中值定理
  8. java 临时文件_Java临时文件
  9. MEX and Increments-(先拿一些的贪心思维)
  10. 不同的应用场景AGV导航方式分析
  11. 比较火的NFT数字艺术品交易平台
  12. java斗地主发牌_实现斗地主发牌(java)
  13. 7-3 是不是太胖了
  14. FC6安装配置详细介绍
  15. SAP ABAP BDC(批量数据通信)-018
  16. 在pycharm中利用labelme标注生成语义分割文件
  17. 第3章 软件测试方法--基于直觉和经验的方法
  18. 勉励-----计算机科学专业的同学,你应该会什么
  19. matlab 实验代码,matlab实验2代码
  20. linux普通账户变为管理员,你就可以将普通账户升级为管理员账户了

热门文章

  1. (十)Centos之文件搜索命令find
  2. 设计模式学习(二): 观察者模式 (C#)
  3. Java精选笔记_XML基础
  4. ERROR MESSAGE: Invalid command line: Malformed walker argument: Could not find walker with name
  5. java接口关于interface关键字
  6. Delphi 中的 XMLDocument 类详解(5) - 获取元素内容
  7. linux修改ssh端口和禁止root远程登陆设置
  8. Redis list 之增删改查
  9. IDC公司:服务器类微处理器市场最新预测
  10. __getattribute__()、__getattr__()、__setattr__()、__delattr__()