- 浏览: 262731 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (88)
- JAVA / base (26)
- JAVA / web (12)
- JAVA / Lib-tools (5)
- SERVER / tomcat (4)
- DB / mysql (4)
- DB / mongodb (2)
- DB / memcached (2)
- DB / redis (2)
- WEB / Front-end (3)
- WEB / security (4)
- WEB / css (2)
- WEB / js (4)
- OS / linux (3)
- IT / Architecture (4)
- IT / other (2)
- Android (9)
- Go (1)
- Other (1)
- OS / Mac (2)
最新评论
-
Zero2Max:
哈哈,马士兵老师也发现了。
java实现接口的bug -
xly1981:
能像CSRF攻击一样带个图就更棒了
XSS跨站攻击 -
xmong:
df274119386 写道在javascript中看到下面的 ...
CSRF攻击与防御策略 -
df274119386:
在javascript中看到下面的语句 e.value = t ...
CSRF攻击与防御策略 -
xmong:
yzxqml 写道xmong 写道yzxqml 写道tomca ...
Tomcat集群
Java多线程实现订单模式:
客户端线程向服务端发起请求后,请求处理需要较长时间处理,这个时候客户端又需要及时得到一个结果响应,这好比我们去蛋糕店订蛋糕,蛋糕往往需要几个小时才能完成,这个时候店员就会给我一个订单,说过几个小时回来取蛋糕。
摸拟场景,客户端线程向服务端发起请求获取数据内容,数据准备需要很长时间,这个时候我们可以及时返回一个虚拟数据结果,服务器端启动新线程准备数据,一段时间后客户端线程在根据虚拟数据结果来获取真实数据内容。
设计如下:
Main:程序main类,负责发起客户端请求。
Server:服务端类,负责接收请求,创建新线程处理请求。
Data:数据接口,提供获取数据内容接口。
VistualData:虚拟数据类,实现data接口,服务端快速响应的虚拟数据结果,可以获取真实数据内容。
RealData:真实数据类,实现data接口,提供处理数据内容和存储真实数据内容。
时序图如下:
实现如下:
Main:main类发出请求
Server:服务类,处理请求
Data:data接口
VirtualData:虚拟数据类
RealData:真实数据类
执行结果如下:
客户端线程向服务端发起请求后,请求处理需要较长时间处理,这个时候客户端又需要及时得到一个结果响应,这好比我们去蛋糕店订蛋糕,蛋糕往往需要几个小时才能完成,这个时候店员就会给我一个订单,说过几个小时回来取蛋糕。
摸拟场景,客户端线程向服务端发起请求获取数据内容,数据准备需要很长时间,这个时候我们可以及时返回一个虚拟数据结果,服务器端启动新线程准备数据,一段时间后客户端线程在根据虚拟数据结果来获取真实数据内容。
设计如下:
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...
发表评论
-
Java validation(java验证器实现)
2014-03-18 11:45 3693Java validation 1. java验证器 在 ... -
Memo class备注类信息
2014-03-18 09:52 882Memo Class 1. 什么是Memo Class Mem ... -
java annotation注解
2014-01-24 18:01 9461. Annotation的声明方式 An ... -
Java RMI
2013-03-28 15:12 1712Java Rmi 目录 1 JAVA RMI 1 ... -
java内部类
2013-03-19 16:25 1041Java内部类 目录 1 JAVA ... -
java多线程设计模式之线程池处理请求
2013-03-08 17:50 1818Java实现线程池处理请求: 客户端线程发出请求,请求存入请 ... -
java多线程设计模式之异步处理请求
2013-03-08 12:36 4524Java实现多线程异步处理请求: Java实现多线程异步处理 ... -
java多线程设计模式之读写文件模式
2013-03-07 17:56 1586Java实现多线程读写数据 ... -
java多线程设计模式之生产者与消费者
2013-03-07 11:34 1053Java实现多线程生产者与消费者: 生产者线程负责生产产品 ... -
java多线程设计模式之文件保存
2013-03-06 16:16 1606Java实现多线程保存文件:两线程去保存文件,一个保存线程定时 ... -
java多线程设计模式之队列通信
2013-03-06 13:51 2489Java实现多线程处理队列请求通信:客户端线程向请求队列中不断 ... -
Java读linux系统文件文件名乱码
2012-12-06 17:01 91601,问题描述 web应用想通过Java读取linux系统文件显 ... -
Java安全加密
2012-11-28 10:24 1972安全加密 目录 1 加密安全 1 1.1 应用的安全 1 ... -
图着色问题
2012-11-27 13:05 3110图着色问题 目录 1 图 ... -
JDK6新特性
2012-07-03 23:24 2898JDK6的新特性 JDK6的新特性之一_Desktop类 ... -
JDK7新特性
2012-07-03 15:39 3505JDK7新特性 一 JDK7新特性简介 准备 JDK7下载 ... -
JDK5新特性
2012-07-03 10:23 73JDK5.0新特性 1.自动封箱和自动解封(简单类型和封装类 ... -
java多线程
2012-06-15 15:12 1561Java多线程 目录 1 线 ... -
代理模式
2012-06-13 14:12 1367代理模式 目录 1 代理 ... -
java垃圾回收机制
2012-06-11 11:30 2562Java内存回收 目录 1 JAVA内存STACK和HE ...
相关推荐
设计模式是经过时间考验、广泛接受的解决方案模板,用于解决特定的软件设计问题,尤其是在多线程、分布式系统和高并发环境中。Java语言由于其面向对象的特性,非常适合应用设计模式来构建可维护、可扩展且高效的系统...
### Java常用的设计模式详解 #### 一、工厂模式(Factory) **定义:** 工厂模式是一种创建型设计模式,提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 **应用场景...
Java中的扇出扇入设计模式旨在通过将一个任务划分为多个可以并行处理的子任务(扇出),然后将这些子任务的结果合并为一个单一的结果(扇入),来提高并发性和优化处理时间。 ## 二、别名 * 分散收集 ## 三、扇出...
### Java设计模式详解 #### 一、策略模式 策略模式是一种行为型设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。该模式使得算法可以独立于使用它的客户而变化。 **应用场景** - ...
"JAVA设计模式之事务处理"主要关注如何在业务逻辑中有效地管理和控制事务。 事务处理在企业级应用中至关重要,因为它确保数据的一致性和完整性。Java平台提供了Java Transaction API (JTA) 来处理全局事务,适用...
在Java中,通常使用双重检查锁定(Double-Checked Locking)或静态内部类的方式来实现线程安全的单例,防止多线程环境下出现多个实例。例如,配置管理器或日志服务通常会使用单例模式。 3. 建造者模式:建造者模式...
Java多线程是Java编程中的重要特性,它允许程序同时执行多个任务,提高系统效率和响应速度。在点餐系统中,多线程的应用主要体现在以下几个方面: 1. 客户端并发处理:每个客户请求可以视为一个独立的线程,使得多...
以下将详细阐述Java在商品订单系统中的核心概念、设计模式以及实现方法。 1. **对象模型**:在Java中,商品和订单通常被建模为类。`Order.java`可能是实现订单类的源代码文件,其中包含了订单的属性(如订单号、...
8. **多线程**:如果订单打印需要异步处理,开发者可能需要使用Java的多线程技术,如`Thread`类或`ExecutorService`,以确保用户界面的响应性和打印任务的并行处理。 9. **单元测试**:为了保证代码质量,开发者...
- **Java编程**:掌握Java基础语法、面向对象编程、异常处理、集合框架、IO流、多线程、网络编程等。 - **数据库设计**:理解关系数据库理论,如ER模型,能够设计合理的数据库表结构,使用SQL进行数据操作。 - **...
基于事件的异步模式允许系统处理可能需要一些时间才能完成的任务,而... - 基于事件的异步设计模式允许任务在后台执行,并在完成时通过事件通知主程序,从而在不阻塞正在进行的操作的情况下提高系统效率和响应能力。
设计模式是软件开发中的一种最佳实践,它提供了一套经过验证的、通用的解决方案,用于解决常见的编程问题。设计模式可以提升代码的可读性、可维护性和可扩展性,遵循一些基本原则,如单一职责原则、开闭原则、依赖...
《使用Disruptor设计模式构建Java后端订单匹配引擎》 在Java后端开发中,高性能、低延迟的订单匹配引擎是金融交易系统的核心部分。本文将深入探讨如何利用Disruptor设计模式来构建这样的系统,同时也会触及到一些...
8. **多线程**:如果系统支持并发操作,如用户同时添加书籍到购物车,那么多线程的概念将被应用以提高性能。 9. **设计模式**:除了MVC,可能还应用了其他设计模式,如工厂模式(用于创建对象)、单例模式(确保类...
9. **设计模式**:在系统设计中,可以应用多种设计模式,如工厂模式用于创建对象,策略模式处理不同的支付方式,单例模式确保数据库连接池只有一个实例,观察者模式用于实时更新用户界面等。 10. **持续集成/持续...
5. **多线程** 如果仓库管理系统需要处理并发操作,比如多个用户同时下订单,那么了解Java的线程和并发控制就非常重要。可以使用Thread类、Runnable接口或者ExecutorService来管理并发任务,确保系统稳定运行。 6....
5. **多线程**:Java提供对多线程的支持,可以创建Thread对象或实现Runnable接口,理解线程同步和互斥的概念,如synchronized关键字和wait/notify机制。 6. **网络编程**:Java的Socket编程用于客户端-服务器交互,...
设计模式是解决常见软件设计问题的模板或蓝图,它们已经被广泛接受并应用于Java开发中。例如,单例模式确保一个类只有一个实例,控制了类的实例化过程。工厂模式提供了一种创建对象的接口,而无需指定其具体的类,...
5. **多线程**:租车系统可能涉及到并发操作,如多个用户同时预订车辆,这就需要使用到Java的多线程技术,以保证系统的高效运行和数据的一致性。 6. **异常处理**:在租车系统中,错误处理和异常捕获是必不可少的,...
在订单管理中,可以使用Java的多线程技术来处理并发的订单请求,提高系统处理效率。库存管理则涉及到库存预警和自动补货等逻辑,可以通过设计状态机模型来实现。供应商管理则可能需要通过网络调用API,Java的HTTP...