一、Future模式
如果在Client远程调用的时候,Server端需要大量的时间去处理,这时候Server段先返回一个mock的对象让访问完成,Client端并不处理这个数据,而且去执行其他的程序,直到请求返回。
代码如下
1、Main方法
public class Main {
public static void main(String[] args) {
Client client = new Client();
Data data = client.request("name");
System.out.println("request end");
try {
Thread.sleep(2000);
} catch (Exception e) {
}
System.out.println("real data" + data.getResult());
}
}
2、Client端
public class Client {
public Data request(final String string) {
final FuntureData future = new FuntureData();
new Thread() {
@Override
public void run() {
RealDate realData = new RealDate(string);
future.setRealData(realData);
}
}.start();
return future;
}
}
启动一个线程去调用,然后直接返回一个futrue对象。
3、接口
public interface Data {
public String getResult();
}
4、FuntureData
public class FuntureData implements Data {
protected RealDate realDate;
protected boolean isReady;
public synchronized void setRealData(RealDate realData) {
if (isReady) {
return;
}
this.realDate = realData;
isReady = true;
notifyAll();
}
@Override
public synchronized String getResult() {
while (!isReady) {
try {
wait();
} catch (Exception e) {
// TODO: handle exception
}
}
return realDate.getResult();
}
}
Funture 模式的核心。当返回后main使用getResult方法的时候,这个时候真实的数据没有没有完成,这个时候标志位是false。这个时候使用wait()方法。同时Client之前就调用set方法,这个时候如果真实数据加载完成就会把标志位设置为true。同时唤醒进程。所以最好返回的Result就是已经加载好的。
JDK的实现:
1、RealData
public class RealData implements Callable<String> {
private final String para;
public RealData(String para) {
this.para = para;
}
@Override
public String call() throws Exception {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 10; i++) {
sb.append(para);
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO: handle exception
}
}
return sb.toString();
}
}
实现Callable接口
2、Main
public class Main {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
FutureTask<String> future = new FutureTask<String>(new RealData("a"));
ExecutorService es = Executors.newFixedThreadPool(1);
es.submit(future);
System.out.println("request end");
try {
Thread.sleep(2000);
} catch (Exception e) {
}
System.out.println("real data" + future.get());
}
}
分享到:
相关推荐
第四,介绍并行的基本设计模式及Java 8对并行程序的支持和改进。第五,介绍高并发框架Akka的使用方法。最后,详细介绍并行程序的调试方法。 《实战Java高并发程序设计》内容丰富,实例典型,实用性强,适合有一定...
Java分布式应用学习笔记 在Java世界中,分布式应用是指由多个独立组件通过网络通信协同工作的系统。这种架构模式常用于构建大规模、高可用性、可扩展的系统。本笔记将深入探讨Java分布式应用的核心概念、技术和实践...
16. **设计模式**:可能包含常见的23种设计模式,如单例,工厂,观察者,装饰器,适配器等模式的应用场景和实现。 17. **JVM内部机制**:虚拟机内存结构,类加载机制,字节码执行,性能优化等方面的知识。 这份...
DAO(Data Access Object)设计模式是一种用于分离数据访问逻辑和业务逻辑的软件设计模式。它将数据访问逻辑封装在一个DAO类中,让上层业务逻辑只需要通过接口和DAO类进行通信,从而达到解耦和层之间的分离。 以上...
这份资料不仅涵盖了基础的Java语法、面向对象设计原则,还深入到高级主题如多线程、并发编程、JVM内存模型、性能优化、分布式系统设计等。以下是对这些知识点的详细阐述: 1. **Java基础** - 类与对象:理解面向...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle...同时,了解和掌握设计模式,能够提高你解决复杂问题的能力。记得多做练习,参与开源项目,不断挑战自己,才能在Java开发的道路上越走越远。
它的设计目标是具有简单的、面向对象的、健壮的、安全的、平台独立的、可移植的、多线程的和高性能的特点。这份"JAVA学习笔记"涵盖了从基础到深入的Java知识体系,对于初学者和进阶者都是宝贵的学习资源。 首先,...
Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...
- ForkJoinPool是Java 7引入的一种特殊类型的线程池,主要用于并行执行递归任务,特别是适合于分治算法的场景。RecursiveAction和RecursiveTask是ForkJoinPool的基础任务类。 理解并掌握Java线程和线程池的概念及...
在设计多线程应用时,根据需求选择合适的同步机制能有效提高程序的并发性能和正确性。同时,合理地关闭线程池(如在`CountDownLatchExp1`中调用`exec.shutdown()`)也是防止资源浪费和内存泄漏的重要步骤。
其次,"Java 283页技术文档整理.pdf" 可能涵盖了更广泛的 Java 进阶主题,可能包括反射、多线程、并发编程、JVM 内存模型、垃圾回收机制、设计模式等。这些知识对于解决复杂问题和优化性能至关重要。例如,了解如何...
8. **设计模式**:可能采用了单例模式来保证服务器对象的唯一性,或者工厂模式来创建不同类型的聊天对象。 9. **错误处理和日志记录**:良好的错误处理机制和日志记录能帮助排查问题,提高程序的稳定性和可维护性。...
这种设计模式通常称为“前后端分离”,它提高了开发效率,使前后端可以并行开发。后端可能使用了RESTful API设计原则,提供了一组标准化的HTTP方法(如GET, POST, PUT, DELETE)来供前端调用,以操作数据库中的资源...
工厂设计模式 HackerRank Java 问题 阵列旋转 数谷 重复字符串 向左旋转阵列 袜子商人 二维数组 新年混乱 DNA补体 嗡嗡声 笔记本电池寿命 字符串字谜 二维数组 袜子商人 排序和 LeetCode Java 问题 两和 Java高级 ...
### Spark 2 笔记详解 #### 一、Spark 概念 Spark 是一款用于大规模数据处理的统一计算框架,其核心设计目的是实现高效的数据处理能力。Spark 的关键特性包括高性能计算、易于使用的API以及丰富的生态系统。在较高...
五、并发设计模式 1. 生产者-消费者模式:通过队列进行通信,生产者将数据放入队列,消费者从队列中取出数据。 2. 线程池模式:通过预创建线程,避免频繁创建销毁线程的开销。 3. 双重检查锁定(Double-Checked ...
以上只是JavaNote-main可能涉及的部分内容,实际压缩包可能还包含更多如设计模式、数据库连接、JVM优化、反射、注解等进阶主题。学习Java时,理解并实践这些知识点将有助于成为一名熟练的Java开发者。
Apache Spark是一款专为大规模数据处理而设计的高性能、通用的计算引擎。它的核心特点在于提供了强大的内存计算能力,从而显著提升了数据处理的速度。Spark最初采用Scala语言开发,因此与Scala有很好的集成性,这让...
通过阅读别人的代码,可以学习到很多实用的编程技巧和设计模式。此外,还可以参考一些经典书籍,如《Effective Java》等。 #### 18. 善用搜索引擎 遇到问题时,学会利用搜索引擎查找答案是非常重要的。Google等搜索...