`
donald3003a
  • 浏览: 65686 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
  • 淼淼E馒头: 这举列有点不恰当啊。。电影人和不同类型的电影。是两个不同概念 ...
    合成模式

java 性能优化读书笔记(四) 并行设计模式

 
阅读更多
一、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高并发程序设计 .pdf 下载

    第四,介绍并行的基本设计模式及Java 8对并行程序的支持和改进。第五,介绍高并发框架Akka的使用方法。最后,详细介绍并行程序的调试方法。 《实战Java高并发程序设计》内容丰富,实例典型,实用性强,适合有一定...

    Java分布式应用学习笔记

    Java分布式应用学习笔记 在Java世界中,分布式应用是指由多个独立组件通过网络通信协同工作的系统。这种架构模式常用于构建大规模、高可用性、可扩展的系统。本笔记将深入探讨Java分布式应用的核心概念、技术和实践...

    非常详细javaSE学习笔记.rar

    16. **设计模式**:可能包含常见的23种设计模式,如单例,工厂,观察者,装饰器,适配器等模式的应用场景和实现。 17. **JVM内部机制**:虚拟机内存结构,类加载机制,字节码执行,性能优化等方面的知识。 这份...

    李兴华java1.8视频笔记

    DAO(Data Access Object)设计模式是一种用于分离数据访问逻辑和业务逻辑的软件设计模式。它将数据访问逻辑封装在一个DAO类中,让上层业务逻辑只需要通过接口和DAO类进行通信,从而达到解耦和层之间的分离。 以上...

    Java架构面试专题汇总(含答案)和学习笔记.zip

    这份资料不仅涵盖了基础的Java语法、面向对象设计原则,还深入到高级主题如多线程、并发编程、JVM内存模型、性能优化、分布式系统设计等。以下是对这些知识点的详细阐述: 1. **Java基础** - 类与对象:理解面向...

    计算机-java-自学笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle...同时,了解和掌握设计模式,能够提高你解决复杂问题的能力。记得多做练习,参与开源项目,不断挑战自己,才能在Java开发的道路上越走越远。

    JAVA学习笔记

    它的设计目标是具有简单的、面向对象的、健壮的、安全的、平台独立的、可移植的、多线程的和高性能的特点。这份"JAVA学习笔记"涵盖了从基础到深入的Java知识体系,对于初学者和进阶者都是宝贵的学习资源。 首先,...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    线程四笔记,对于正在学习Java的朋友可以参考一下

    - ForkJoinPool是Java 7引入的一种特殊类型的线程池,主要用于并行执行递归任务,特别是适合于分治算法的场景。RecursiveAction和RecursiveTask是ForkJoinPool的基础任务类。 理解并掌握Java线程和线程池的概念及...

    java中的并发变成学习笔记2

    在设计多线程应用时,根据需求选择合适的同步机制能有效提高程序的并发性能和正确性。同时,合理地关闭线程池(如在`CountDownLatchExp1`中调用`exec.shutdown()`)也是防止资源浪费和内存泄漏的重要步骤。

    java+springboot.zip

    其次,"Java 283页技术文档整理.pdf" 可能涵盖了更广泛的 Java 进阶主题,可能包括反射、多线程、并发编程、JVM 内存模型、垃圾回收机制、设计模式等。这些知识对于解决复杂问题和优化性能至关重要。例如,了解如何...

    广东工业大学-java课程作业-基于java的聊天程序.zip

    8. **设计模式**:可能采用了单例模式来保证服务器对象的唯一性,或者工厂模式来创建不同类型的聊天对象。 9. **错误处理和日志记录**:良好的错误处理机制和日志记录能帮助排查问题,提高程序的稳定性和可维护性。...

    cccctyl-java-basic-notes-master_java_

    这种设计模式通常称为“前后端分离”,它提高了开发效率,使前后端可以并行开发。后端可能使用了RESTful API设计原则,提供了一组标准化的HTTP方法(如GET, POST, PUT, DELETE)来供前端调用,以操作数据库中的资源...

    tictactoeleetcode-JavaPlayground:Java注解、线程使用、设计模式、算法训练等

    工厂设计模式 HackerRank Java 问题 阵列旋转 数谷 重复字符串 向左旋转阵列 袜子商人 二维数组 新年混乱 DNA补体 嗡嗡声 笔记本电池寿命 字符串字谜 二维数组 袜子商人 排序和 LeetCode Java 问题 两和 Java高级 ...

    spark 2 笔记

    ### Spark 2 笔记详解 #### 一、Spark 概念 Spark 是一款用于大规模数据处理的统一计算框架,其核心设计目的是实现高效的数据处理能力。Spark 的关键特性包括高性能计算、易于使用的API以及丰富的生态系统。在较高...

    并发编程笔记+包含所有

    五、并发设计模式 1. 生产者-消费者模式:通过队列进行通信,生产者将数据放入队列,消费者从队列中取出数据。 2. 线程池模式:通过预创建线程,避免频繁创建销毁线程的开销。 3. 双重检查锁定(Double-Checked ...

    JavaNote-main

    以上只是JavaNote-main可能涉及的部分内容,实际压缩包可能还包含更多如设计模式、数据库连接、JVM优化、反射、注解等进阶主题。学习Java时,理解并实践这些知识点将有助于成为一名熟练的Java开发者。

    spark学习笔记

    Apache Spark是一款专为大规模数据处理而设计的高性能、通用的计算引擎。它的核心特点在于提供了强大的内存计算能力,从而显著提升了数据处理的速度。Spark最初采用Scala语言开发,因此与Scala有很好的集成性,这让...

    Java心得 学JAVA必看

    通过阅读别人的代码,可以学习到很多实用的编程技巧和设计模式。此外,还可以参考一些经典书籍,如《Effective Java》等。 #### 18. 善用搜索引擎 遇到问题时,学会利用搜索引擎查找答案是非常重要的。Google等搜索...

Global site tag (gtag.js) - Google Analytics