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();
OK,你现在可以抽烟,喝酒,泡妞.ft会为你完成所有的工作.
分享到:
相关推荐
本篇将深入探讨如何在Java中实现异步调用,以及相关的核心概念和技术。 1. **线程与并发** 异步调用的基础是线程并发执行。Java提供了多线程支持,通过`Thread`类或者`Runnable`接口可以创建并启动新线程。当一个...
Java异步调用转同步方法实例详解 Java异步调用转同步方法实例详解是指在Java中将异步调用转换为同步调用的技术,主要用于解决异步调用过程中的阻塞问题。异步调用是一种非阻塞的调用方式,调用方在调用过程中,不...
在本实例中,我们将深入探讨如何使用Java实现多线程以实现异步调用,并理解其背后的机制。 首先,多线程允许一个程序同时执行多个任务。在Java中,我们可以通过继承`Thread`类或实现`Runnable`接口来创建线程。在这...
本文将深入探讨如何使用Java来实现异步调用,以及它在后端开发中的应用。 1. **Java中的异步调用基础** - **线程与并发**:Java中的异步调用通常基于多线程或并发执行。Java内置了对多线程的支持,通过`Thread`类...
在Java中实现异步调用通常涉及多线程和回调机制。以下是基于给定实例代码的详细解释: 1. **角色分析**: - **调用者(Caller)**:发起异步调用的主体,它通常是主线程或者用户界面线程,需要等待异步任务完成但...
"如何用Java回调和线程实现异步调用" 在软件开发中,异步调用是一种非阻塞式调用方式,用于在处理比较耗时的任务时保证程序的连续性和实时性。实现异步调用的关键在于解决三个技术难题:程序阻塞问题、异步消息的...
5. **NIO(非阻塞I/O)**: Java的`HttpAsyncClient`依赖于Java NIO(非阻塞I/O)来实现异步操作。NIO允许单个线程处理多个连接,显著提高了系统资源的利用率。 6. **线程池**: `HttpAsyncClient`通常会使用线程池来...
本篇文章将详细介绍如何使用Java的HttpClient实现异步请求资源。 首先,让我们了解什么是异步请求。在同步请求中,调用一个API或发送一个HTTP请求后,程序会等待响应返回,然后继续执行后续代码。而异步请求则不同...
8. Java异步调用:Java异步调用是指在Java编程中,使用异步调用方式来调用接口的方法。 9. 同步调用:同步调用是指在调用方需要等待被调用方完成操作的调用方式。 10. 取货凭证:取货凭证是指调用方在调用时获得的...
这个“ICE异步调用Demo源码”是针对ICE框架的一个示例,展示了如何在C++环境中实现异步调用功能,特别是 adm 和 ami 函数的调用与异步分发。以下将详细解析这个Demo中的关键知识点: 1. **ICE框架**:ICE由ZeroC...
用java代码实现了UPDATE,这里是java源代码。‘增删改查’记录,‘改查’实现了目前增有得完善代码,删没删除需求就没添加删的代码。源代码,需要在param.properties文件中填写对应KEYValue值。同时也可以参考我的...
- 在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中实现异步调用来处理耗时操作,如数据库查询或复杂计算。 异步调用的基本概念是,...
在Java中,Akka可以用来实现TCP远程调用,这使得不同系统之间能够通过网络进行通信。下面我们将深入探讨如何使用Akka与Java来实现TCP远程调用,以及其中涉及的关键知识点。 首先,我们需要理解Akka的Actor系统。...
基于回调实现Java的异步调用 异步调用是指调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通知调用者,或通过回调函数处理这个调用。回调简单地说就是B中有一个A,这样A在调用B的某个方法时实际...
- **AXIS2的异步调用机制**:AXIS2使用MessageReceiver接口处理消息,对于异步调用,可以实现AsyncMessageReceiver接口。当服务端接收到请求后,不会立即返回,而是将工作交给后台线程处理,并在完成后通过回调机制...