`
xmong
  • 浏览: 264125 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java多线程设计模式之订单模式

阅读更多
Java多线程实现订单模式:

客户端线程向服务端发起请求后,请求处理需要较长时间处理,这个时候客户端又需要及时得到一个结果响应,这好比我们去蛋糕店订蛋糕,蛋糕往往需要几个小时才能完成,这个时候店员就会给我一个订单,说过几个小时回来取蛋糕。
摸拟场景,客户端线程向服务端发起请求获取数据内容,数据准备需要很长时间,这个时候我们可以及时返回一个虚拟数据结果,服务器端启动新线程准备数据,一段时间后客户端线程在根据虚拟数据结果来获取真实数据内容。

设计如下:



Main:程序main类,负责发起客户端请求。
Server:服务端类,负责接收请求,创建新线程处理请求。
Data:数据接口,提供获取数据内容接口。
VistualData:虚拟数据类,实现data接口,服务端快速响应的虚拟数据结果,可以获取真实数据内容。
RealData:真实数据类,实现data接口,提供处理数据内容和存储真实数据内容。

时序图如下:




实现如下:

Main:main类发出请求

package com.thread.order;

/**
 * main类,想服务发出请求,获取请求数据
 * @author Administrator
 *
 */
public class Main {
	
	/**
	 * main方法
	 * @param args
	 */
	public static void main(String[] args) {
		
		System.out.println("main start...");
		//创建服务
		Server server = new Server();
		//调用三个数据服务请求
		Data data1 = server.getData('a', 2);
		Data data2 = server.getData('b', 3);
		Data data3 = server.getData('c', 4);
		//main线程休息2秒
		try {
			Thread.sleep(2000);
		} catch (Exception e) {
		}
		//输出数据内容
		System.out.println("data1="+data1.getContent());
		System.out.println("data2="+data2.getContent());
		System.out.println("data3="+data3.getContent());
		
		System.out.println("main end...");
		
	}

}


Server:服务类,处理请求

package com.thread.order;

/**
 * 服务类,处理服务请求
 * @author Administrator
 *
 */
public class Server {

	/**
	 * 返回虚拟数据结果,启动线程处理数据内容。
	 * @param c
	 * @param count
	 * @return
	 */
	public Data getData(final char c, final int count){
		
		final VirtualData vdata = new VirtualData();
		System.out.println("start getData:"+c);
		//启动新线程处理数据
		new Thread(){
			public  void run(){
				System.out.println(Thread.currentThread().getName()+".start."+c);
				RealData rdata = new RealData();
				rdata.setContent(c, count);//设置真实数据内容
				vdata.setRealData(rdata);//设置真实数据与虚拟数据关联
				System.out.println(Thread.currentThread().getName()+".end."+c);
			}
		}.start();
		System.out.println("end getData:"+c);
		return vdata;
	}
	
}


Data:data接口

package com.thread.order;

/**
 * 数据服务接口
 * @author Administrator
 *
 */
public interface Data {
	
	/**
	 * 数据内容接口
	 * @return
	 */
	public String getContent();
}


VirtualData:虚拟数据类

package com.thread.order;

/**
 * 虚拟数据类
 * @author Administrator
 *
 */
public class VirtualData implements Data{
	
	//真实数据
	private RealData realData;
	//数据准备标准,true表示数据准备完成,false表示数据尚未准备完成
	private boolean ready = false;
	
	/**
	 * 设置真实数据
	 * 判断虚拟数据是否已经设置真实数据
	 * 如果没有真实数据则执行真实数据设置
	 * 如果有真实数据,则推出设置
	 * @param rdata
	 */
	public synchronized void setRealData(RealData rdata){
		if(ready){
			return;
		}
		System.out.println(Thread.currentThread().getName()+" set RealData");
		this.realData = rdata;
		this.ready = true;
		notifyAll();
	}

	/**
	 * 获取数据内容
	 * 判断真实数据是否设置,
	 * 如果设置则返回真实数据内容
	 * 如果没有设置则线程等待其他线程设置数据
	 */
	@Override
	public synchronized String getContent() {
		while (!ready){
			try {
				System.out.println(Thread.currentThread().getName()+"{wait}");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		return realData.getContent();
	}

}


RealData:真实数据类

package com.thread.order;

import java.util.Random;

/**
 * 真实数据类
 * @author Administrator
 *
 */
public class RealData implements Data{

	//数据内容
	private String content;
	private Random random = new Random();
	
	/**
	 * 设置数据内容
	 * @param c
	 * @param count
	 */
	public void setContent(char c, int count){
		char[] buffer = new char[count];
		for (int i = 0; i < count; i++) {
			buffer[i] = c;
			try {
				Thread.sleep(random.nextInt(1000));//随机休息
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		content = new String(buffer);
	}
	
	/**
	 * 获取数据内容
	 */
	@Override
	public String getContent() {
		return content;
	}

}

执行结果如下:

main start...
start getData:a
end getData:a
start getData:b
Thread-0.start.a
end getData:b
start getData:c
end getData:c
Thread-1.start.b
Thread-2.start.c
Thread-0 set RealData
Thread-0.end.a
Thread-1 set RealData
Thread-1.end.b
data1=aa
data2=bbb
mian {wait}
Thread-2 set RealData
Thread-2.end.c
data3=cccc
main end...




  • 大小: 60.6 KB
  • 大小: 25.3 KB
分享到:
评论

相关推荐

    Java 企业设计模式

    设计模式是经过时间考验、广泛接受的解决方案模板,用于解决特定的软件设计问题,尤其是在多线程、分布式系统和高并发环境中。Java语言由于其面向对象的特性,非常适合应用设计模式来构建可维护、可扩展且高效的系统...

    Java常用的设计模式

    ### Java常用的设计模式详解 #### 一、工厂模式(Factory) **定义:** 工厂模式是一种创建型设计模式,提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 **应用场景...

    【Java设计模式-源码】扇出扇入模式

    Java中的扇出扇入设计模式旨在通过将一个任务划分为多个可以并行处理的子任务(扇出),然后将这些子任务的结果合并为一个单一的结果(扇入),来提高并发性和优化处理时间。 ## 二、别名 * 分散收集 ## 三、扇出...

    java设计模式1

    ### Java设计模式详解 #### 一、策略模式 策略模式是一种行为型设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。该模式使得算法可以独立于使用它的客户而变化。 **应用场景** - ...

    JAVA设计模式之事务处理

    "JAVA设计模式之事务处理"主要关注如何在业务逻辑中有效地管理和控制事务。 事务处理在企业级应用中至关重要,因为它确保数据的一致性和完整性。Java平台提供了Java Transaction API (JTA) 来处理全局事务,适用...

    设计模式-Java语言中的应用

    在Java中,通常使用双重检查锁定(Double-Checked Locking)或静态内部类的方式来实现线程安全的单例,防止多线程环境下出现多个实例。例如,配置管理器或日志服务通常会使用单例模式。 3. 建造者模式:建造者模式...

    多线程点餐系统(包括服务端和客户端)

    Java多线程是Java编程中的重要特性,它允许程序同时执行多个任务,提高系统效率和响应速度。在点餐系统中,多线程的应用主要体现在以下几个方面: 1. 客户端并发处理:每个客户请求可以视为一个独立的线程,使得多...

    java 商品订单的资源

    以下将详细阐述Java在商品订单系统中的核心概念、设计模式以及实现方法。 1. **对象模型**:在Java中,商品和订单通常被建模为类。`Order.java`可能是实现订单类的源代码文件,其中包含了订单的属性(如订单号、...

    java订单打印

    8. **多线程**:如果订单打印需要异步处理,开发者可能需要使用Java的多线程技术,如`Thread`类或`ExecutorService`,以确保用户界面的响应性和打印任务的并行处理。 9. **单元测试**:为了保证代码质量,开发者...

    基于Java的订单管理系统的设计与实现任务书和指导书

    - **Java编程**:掌握Java基础语法、面向对象编程、异常处理、集合框架、IO流、多线程、网络编程等。 - **数据库设计**:理解关系数据库理论,如ER模型,能够设计合理的数据库表结构,使用SQL进行数据操作。 - **...

    【Java设计模式】基于事件的异步模式:掌握非阻塞系统设计

    基于事件的异步模式允许系统处理可能需要一些时间才能完成的任务,而... - 基于事件的异步设计模式允许任务在后台执行,并在完成时通过事件通知主程序,从而在不阻塞正在进行的操作的情况下提高系统效率和响应能力。

    设计模式1-创建型模式.doc

    设计模式是软件开发中的一种最佳实践,它提供了一套经过验证的、通用的解决方案,用于解决常见的编程问题。设计模式可以提升代码的可读性、可维护性和可扩展性,遵循一些基本原则,如单一职责原则、开闭原则、依赖...

    matching-engine:使用Disruptor设计模式匹配Java后端的订单

    《使用Disruptor设计模式构建Java后端订单匹配引擎》 在Java后端开发中,高性能、低延迟的订单匹配引擎是金融交易系统的核心部分。本文将深入探讨如何利用Disruptor设计模式来构建这样的系统,同时也会触及到一些...

    java课程设计报告及代码-关于购物车

    8. **多线程**:如果系统支持并发操作,如用户同时添加书籍到购物车,那么多线程的概念将被应用以提高性能。 9. **设计模式**:除了MVC,可能还应用了其他设计模式,如工厂模式(用于创建对象)、单例模式(确保类...

    java设计手机交易

    9. **设计模式**:在系统设计中,可以应用多种设计模式,如工厂模式用于创建对象,策略模式处理不同的支付方式,单例模式确保数据库连接池只有一个实例,观察者模式用于实时更新用户界面等。 10. **持续集成/持续...

    仓库管理系统java课程设计

    5. **多线程** 如果仓库管理系统需要处理并发操作,比如多个用户同时下订单,那么了解Java的线程和并发控制就非常重要。可以使用Thread类、Runnable接口或者ExecutorService来管理并发任务,确保系统稳定运行。 6....

    java 毕业设计论文

    5. **多线程**:Java提供对多线程的支持,可以创建Thread对象或实现Runnable接口,理解线程同步和互斥的概念,如synchronized关键字和wait/notify机制。 6. **网络编程**:Java的Socket编程用于客户端-服务器交互,...

    java设计方案

    设计模式是解决常见软件设计问题的模板或蓝图,它们已经被广泛接受并应用于Java开发中。例如,单例模式确保一个类只有一个实例,控制了类的实例化过程。工厂模式提供了一种创建对象的接口,而无需指定其具体的类,...

    java实现简易租车系统

    5. **多线程**:租车系统可能涉及到并发操作,如多个用户同时预订车辆,这就需要使用到Java的多线程技术,以保证系统的高效运行和数据的一致性。 6. **异常处理**:在租车系统中,错误处理和异常捕获是必不可少的,...

    商品管理系统的设计(Java)

    在订单管理中,可以使用Java的多线程技术来处理并发的订单请求,提高系统处理效率。库存管理则涉及到库存预警和自动补货等逻辑,可以通过设计状态机模型来实现。供应商管理则可能需要通过网络调用API,Java的HTTP...

Global site tag (gtag.js) - Google Analytics