下面来看看蛋糕师傅是怎么做蛋糕的:
建立一个字符串,包含count个c字符,为了表现出犯法需要花费一些时间,使用了sleep。
public class RealData implements Data { private final String content;
public RealData(int count, char c) {
System.out.println("making RealData(" + count + ", " + c + ") BEGIN");
char[] buffer = new char[count];
for (int i = 0; i < count; i++) {
buffer[i] = c;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
System.out.println("making RealData(" + count + ", " + c + ") END");
this.content = new String(buffer);
}
public String getContent() {
return content;
}
}
现在来看看“提货单”future是怎么与蛋糕"content"对应的:
public class FutureData implements Data { private RealData realdata = null;
private boolean ready = false;
public synchronized void setRealData(RealData realdata) {
if (ready) {
return; // 防止setRealData被调用两次以上。
}
this.realdata = realdata;
this.ready = true;
notifyAll();
}
public synchronized String getContent() {
while (!ready) {
try {
wait();
} catch (InterruptedException e) {
}
}
return realdata.getContent();
}
}
顾客做完自己的事情后,会拿着自己的“提货单”来取蛋糕:
System.out.println("data1 = " + data1.getContent());
这时候如果蛋糕没做好,就只好等了:
while (!ready) { try {
wait();
} catch (InterruptedException e) {
}
//等做好后才能取到
return realdata.getContent();
程序分析
对于每个请求,host都会生成一个线程,这个线程负责生成顾客需要的“蛋糕”。在等待一段时间以后,如果蛋糕还没有做好,顾客还必须等待。直到“蛋糕被做好”,也就是
future.setRealData(realdata); 执行以后,顾客才能拿走蛋糕。
每个线程只是专门负责制作特定顾客所需要的“蛋糕”。也就是顾客A对应着蛋糕师傅A,顾客B对应着蛋糕师傅B。即使顾客B的蛋糕被先做好了,顾客A也只能等待蛋糕师傅A把蛋糕做好。换句话说,顾客之间没有竞争关系。
类FutureData的两个方法被设置为synchronized,实际上蛋糕师傅A与顾客A之间的互斥关系,也就是顾客A必须等待蛋糕师傅A把蛋糕做好后,才能拿走,而与蛋糕师傅B是否做好了蛋糕没有关系。
分享到:
相关推荐
在本实例中,我们将深入探讨如何使用Java实现多线程以实现异步调用,并理解其背后的机制。 首先,多线程允许一个程序同时执行多个任务。在Java中,我们可以通过继承`Thread`类或实现`Runnable`接口来创建线程。在这...
首先,我们需要理解什么是异步调用。在同步模式下,程序执行流程是线性的,一个任务必须等待前一个任务完成后才能继续执行,这可能导致应用程序在处理耗时操作(如网络请求或大数据计算)时阻塞。而异步调用则允许...
Java中的HTTP异步请求是一种高效的网络通信方式,它允许程序在发送HTTP请求后不等待响应,而是立即继续执行其他任务,当服务器响应时,通过回调函数...理解和熟练运用这些技术,对于提升Java应用程序的性能至关重要。
在Java编程中,异步调用是一种非常重要的技术,它允许程序在等待某个耗时操作完成时继续执行其他任务,从而提高系统效率和响应性。本文将深入探讨如何使用Java来实现异步调用,以及它在后端开发中的应用。 1. **...
总结来说,“ICE异步调用Demo源码”是一个很好的学习资源,可以帮助开发者理解ICE中的异步调用机制,掌握adm和ami的使用方法,以及如何在C++环境中实现这种分布式通信。通过深入研究这个Demo,不仅可以提升对ICE的...
在实际项目中,可以利用各种编程语言(如JavaScript的Promise、async/await,Java的CompletableFuture,或者.NET的async/await)来实现异步调用。 异步调用对于优化性能和提升用户体验至关重要。例如,在网页加载中...
在IT行业中,远程方法调用(Remote Method Invocation, RMI)是Java平台提供的一种机制,允许在不同的Java虚拟机之间进行分布式计算...理解并掌握RMI异步调用的原理和实践,对于任何Java开发者来说都是一项重要的技能。
Struts2是一个非常流行的Java Web框架,用于构建和...总之,理解并掌握Struts2的异步调用机制有助于开发出更高效、交互性更强的Web应用。通过实践案例"struts014",你可以亲手尝试并体验这一功能,进一步巩固理论知识。
8. Java异步调用:Java异步调用是指在Java编程中,使用异步调用方式来调用接口的方法。 9. 同步调用:同步调用是指在调用方需要等待被调用方完成操作的调用方式。 10. 取货凭证:取货凭证是指调用方在调用时获得的...
你需要理解Java并发编程的基本概念,如synchronized关键字、Callable和Future接口,或者使用CompletableFuture进行异步操作。 6. **短信模板与签名**:第三方平台通常会提供预设的短信模板,包含动态变量,比如...
Java异步编程框架Promise是用于处理异步操作的一个重要工具,尤其在Java中,Promise的概念被广泛应用...同时,理解Promise的用法,异步API的几种风格,以及并行和串行调用的场景,对于编写高效的Java异步程序至关重要。
在现代Web应用开发中,性能优化是至关重要的一个环节,特别是在处理大量数据或者高并发请求时。使用异步方式查询数据库记录是提升应用程序...理解并熟练掌握这些异步查询技术,对于构建高效、响应迅速的应用至关重要。
在Java编程中,调用Oracle数据库的存储过程是常见的任务,尤其在处理复杂业务逻辑或高效数据操作时。本文将全面总结如何使用Java与Oracle存储过程进行交互。 首先,理解Oracle存储过程的基本概念。存储过程是预编译...
它涵盖了从基础概念到实战技巧的多个层面,帮助开发者深入理解并有效应用异步调用技术。 【标签】:“Dubbo异步调用的优化共20页” 在分布式系统中,Dubbo是一个广泛使用的Java RPC框架,它提供了高性能、轻量级的...
要实现异步调用,首先需要在Servlet类中声明`@.WebServlet(asyncSupported = true)`注解,这将启用Servlet的异步支持。然后,在`doGet`或`doPost`等方法中,可以调用`HttpServletRequest`的`startAsync()`方法来启动...
Java异步Socket调用的知识点涵盖了Java网络编程中的关键概念和实践技巧,特别是在处理异步通信时使用的技术和方法。在讨论这个话题时,我们通常会涉及到以下几个重要方面: 1. 同步与异步通信: 同步通信指的是...
### JAVA异步通信教程 #### 一、JAVA NIO2 异步通道概述 随着JAVA 7的发布,异步通信成为了开发高性能服务器程序的重要工具之一。为了更好地理解和使用JAVA 7提供的NIO2(New Input/Output)异步通道功能,本教程...
**AQuery 异步调用详解** 在移动开发中,特别是在Android平台,UI线程的流畅性至关重要。AQuery(Android Query)是一个轻量级、高效的库,它为Android提供了类似jQuery的API,用于简化异步操作,如网络请求、图片...
另外,可以考虑使用异步调用提高性能,或者利用缓存策略减少不必要的网络请求。 在实际开发中,可能还需要处理数据类型转换、序列化和反序列化等问题,因为Java和.NET的数据类型可能存在差异。同时,确保你的Java...
首先,理解基本原理:Java通常运行在服务器端,而JavaScript主要在客户端(浏览器)执行。通过Ajax或WebSockets等技术,可以实现在服务器端与客户端之间的通信。Java想要调用HTML5页面中的JS函数,就需要借助这些...