`
xmong
  • 浏览: 258482 次
  • 性别: 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局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    计算机毕业设计,课程设计,基于java电影院订票选座系统

    - 后端: 采用Java语言,遵循MVC设计模式,实现业务逻辑 - 数据库: 使用MySQL或其他数据库存储电影、影厅、座位以及订单信息 2. 主要功能模块 - 影片管理: 管理员可以添加、修改、删除影片信息,如电影名称、上映...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包4

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包3

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包2

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例 Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式 //给客户发一个感谢...

    java范例开发大全源代码

     8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车...

    java范例开发大全

    8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式...

    Java范例开发大全 (源程序)

     8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车适配器...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例 Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式 //给客户发一个感谢...

    Java范例开发大全(全书源程序)

    8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter...

    java范例开发大全(pdf&源码)

    8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式...

    阿里2021届Java开发实习面经

    多线程实现方式 1.继承Thread类 2.实现Runnable接口,作为参数传递给Thread 3.实现Callable接口,使用FatureTask包装该对象并作为Thread参数 买家要看到自己买的订单, 卖家要看到自己卖的订单, 怎么设计数据库 ...

    javaweb物流配货项目源码.rar

    在性能优化方面,源码考虑到了查询效率和数据处理速度,使用了缓存机制和多线程技术以应对高并发场景。综上所述,这个源码文件包不仅适合作为毕业设计或课程设计的课题,更是一个学习和实践现代Web开发技术的宝

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    如果使用到了设计模式,建议在类名中体现出具体模式。例如代理模式的类命名:LoginProxy;观察者模式命名:ResourceObserver。 多选 20.关于数据库模糊检索的描述,下列哪些说法符合《阿里巴巴Java开发手册》:ABD ...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    常用数据结构(List、Dictionary、Array)、多态、常用设计模式、反射、常用.net类库、泛型、IO流、委托事件、正则表达式、XML、反射、GC等。 2、数据库开发及ADO.Net(6天) 核心技术课程 数据库开发基础、...

Global site tag (gtag.js) - Google Analytics