`
zhaoshijie
  • 浏览: 2261694 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java实现异步调用

阅读更多
java实现异步调用



在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;
}
}

为了简单化说明(不把它们的关系开得复杂),这里用Object代替了真实数据.而真实的实现中
我们应该把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();

分享到:
评论

相关推荐

    Java异步调用转同步方法实例详解

    Java异步调用转同步方法实例详解 Java异步调用转同步方法实例详解是指在Java中将异步调用转换为同步调用的技术,主要用于解决异步调用过程中的阻塞问题。异步调用是一种非阻塞的调用方式,调用方在调用过程中,不...

    Java多线程实现异步调用实例

    在本实例中,我们将深入探讨如何使用Java实现多线程以实现异步调用,并理解其背后的机制。 首先,多线程允许一个程序同时执行多个任务。在Java中,我们可以通过继承`Thread`类或实现`Runnable`接口来创建线程。在这...

    java代码实现异步调用代码

    本文将深入探讨如何使用Java来实现异步调用,以及它在后端开发中的应用。 1. **Java中的异步调用基础** - **线程与并发**:Java中的异步调用通常基于多线程或并发执行。Java内置了对多线程的支持,通过`Thread`类...

    JAVA实现异步调用实例代码

    在Java中实现异步调用通常涉及多线程和回调机制。以下是基于给定实例代码的详细解释: 1. **角色分析**: - **调用者(Caller)**:发起异步调用的主体,它通常是主线程或者用户界面线程,需要等待异步任务完成但...

    如何用Java回调和线程实现异步调用.pdf

    "如何用Java回调和线程实现异步调用" 在软件开发中,异步调用是一种非阻塞式调用方式,用于在处理比较耗时的任务时保证程序的连续性和实时性。实现异步调用的关键在于解决三个技术难题:程序阻塞问题、异步消息的...

    javaHttp异步请求

    5. **NIO(非阻塞I/O)**: Java的`HttpAsyncClient`依赖于Java NIO(非阻塞I/O)来实现异步操作。NIO允许单个线程处理多个连接,显著提高了系统资源的利用率。 6. **线程池**: `HttpAsyncClient`通常会使用线程池来...

    java实现HttpClient异步请求资源的方法

    本篇文章将详细介绍如何使用Java的HttpClient实现异步请求资源。 首先,让我们了解什么是异步请求。在同步请求中,调用一个API或发送一个HTTP请求后,程序会等待响应返回,然后继续执行后续代码。而异步请求则不同...

    Java接口异步调用

    8. Java异步调用:Java异步调用是指在Java编程中,使用异步调用方式来调用接口的方法。 9. 同步调用:同步调用是指在调用方需要等待被调用方完成操作的调用方式。 10. 取货凭证:取货凭证是指调用方在调用时获得的...

    ICE异步调用Demo源码

    这个“ICE异步调用Demo源码”是针对ICE框架的一个示例,展示了如何在C++环境中实现异步调用功能,特别是 adm 和 ami 函数的调用与异步分发。以下将详细解析这个Demo中的关键知识点: 1. **ICE框架**:ICE由ZeroC...

    调用阿里云API,java(异步实现)DDNS

    用java代码实现了UPDATE,这里是java源代码。‘增删改查’记录,‘改查’实现了目前增有得完善代码,删没删除需求就没添加删的代码。源代码,需要在param.properties文件中填写对应KEYValue值。同时也可以参考我的...

    利用RMI异步调用

    - 在RMI中,可以使用Java的ExecutorService或CompletableFuture等并发工具来实现异步调用。 3. **RMI异步调用步骤**: - 定义远程接口和实现类,确保方法标记为`remote`。 - 实现服务器端逻辑,包括创建远程对象...

    异步调用

    在.NET框架中,异步调用主要依赖于`async`和`await`关键字,配合`Task`类来实现。 下面,我们以.NET的C#语言为例,看看如何在实际代码中使用异步调用: ```csharp using System; using System.Threading.Tasks; ...

    异步调用流程图

    在实际项目中,可以利用各种编程语言(如JavaScript的Promise、async/await,Java的CompletableFuture,或者.NET的async/await)来实现异步调用。 异步调用对于优化性能和提升用户体验至关重要。例如,在网页加载中...

    Struts2之异步调用机制详解案例struts014

    在Struts2中,异步调用机制是实现页面动态更新和提高用户体验的关键技术之一。这个案例“struts014”很可能展示了如何在Struts2中实现异步调用来处理耗时操作,如数据库查询或复杂计算。 异步调用的基本概念是,...

    akka java实现tcp远程调用

    在Java中,Akka可以用来实现TCP远程调用,这使得不同系统之间能够通过网络进行通信。下面我们将深入探讨如何使用Akka与Java来实现TCP远程调用,以及其中涉及的关键知识点。 首先,我们需要理解Akka的Actor系统。...

    如何基于回调实现Java的异步调用

    基于回调实现Java的异步调用 异步调用是指调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通知调用者,或通过回调函数处理这个调用。回调简单地说就是B中有一个A,这样A在调用B的某个方法时实际...

    异步Web方法调用例子-Java源码

    - **AXIS2的异步调用机制**:AXIS2使用MessageReceiver接口处理消息,对于异步调用,可以实现AsyncMessageReceiver接口。当服务端接收到请求后,不会立即返回,而是将工作交给后台线程处理,并在完成后通过回调机制...

Global site tag (gtag.js) - Google Analytics