需求说明:

模拟网上商城购物,当用户选好物品提交订单时,每笔订单会自动生成一个唯一的订单编号。而部分电子商务网站在数据高峰期时,一毫秒可能需要处理近千笔的订单

现在简单模拟 5 个订单同时提交,生成唯一订单编号的场景。订单编号的生成规则是以毫秒为单位的当前时间+订单序号

例如,当前时间的毫秒数是 150000,那第 1 笔订单的编号就是 1500001,第 9 笔订单的编号就是 1500009

实现思路:

项目中创建订单类 Order(订单编号、订单金额、下单用户)

创建订单处理类 ProcessOrder实现Runnable接口,定义Order类型的成员变量和一个Integer静态count作为订单序号(初始1),同时添加产生订单号的方法

产生订单号方法中使用sleep延迟500毫秒,同时添加同步代码块,指定静态变量 count 为同步监视器,同步代码块内则采用系统时间毫秒和订单序号生成订单号操作

在同步代码块外,把订单用户、订单金额和订单编号打印输出

创建测试启动类 TestOrder。在该类的 main() 方法内,使用有参构造方法实例化 5 个 Order 对象。使用ProcessOrder(Order order) 构造方法,实例化 5 个 ProcessOrder 类的对象,并把 5 个 Order 对象依次传给构造方法的参数 order。分别创建5个Thread对象依次传入5个ProcessOrder,启动测试

实现代码:

订单类(Order)

public class Order {

//订单编号

private String orderNumber;

//订单金额

private double orderAmount;

//用户名称

private String username;

//无参构造

public Order() {

super();

}

//有参构造

public Order(String orderNumber, double orderAmount, String username) {

super();

this.orderNumber = orderNumber;

this.orderAmount = orderAmount;

this.username = username;

}

public String getOrderNumber() {

return orderNumber;

}

public void setOrderNumber(String orderNumber) {

this.orderNumber = orderNumber;

}

public double getOrderAmount() {

return orderAmount;

}

public void setOrderAmount(double orderAmount) {

this.orderAmount = orderAmount;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

}

订单处理类(ProcessOrder)

public class ProcessOrder implements Runnable{

private Order order;

//订单计数器

private static Integer count = 1;

public ProcessOrder(Order order) {

this.order = order;

}

@Override

public void run() {

generateOrderNumber();

}

public void generateOrderNumber() {

try {

//加入线程延迟

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

//同步监听器是count变量

synchronized (count) {

//生成订单编号

StringBuffer orderNumber = new StringBuffer("").append(System.currentTimeMillis()).append(count++);

//将订单编号保存到订单对象中

order.setOrderNumber(orderNumber.toString());

}

System.out.printf("%s的订单金额是%.2f元,订单编号是:%s\n",order.getUsername(),order.getOrderAmount(),order.getOrderNumber());

}

}

启动运行类(TestOrder)

public class TestOrder {

public static void main(String[] args) {

//实例化5个订单对象

Order order1 = new Order(null,300,"张三");

Order order2 = new Order(null,400,"李四");

Order order3 = new Order(null,500,"王五");

Order order4 = new Order(null,300,"赵六");

Order order5 = new Order(null,200,"秦七");

//实例化5个Runnable对象

ProcessOrder processOrder1 = new ProcessOrder(order1);

ProcessOrder processOrder2 = new ProcessOrder(order2);

ProcessOrder processOrder3 = new ProcessOrder(order3);

ProcessOrder processOrder4 = new ProcessOrder(order4);

ProcessOrder processOrder5 = new ProcessOrder(order5);

//实例化5条线程

Thread thread1 = new Thread(processOrder1);

Thread thread2 = new Thread(processOrder2);

Thread thread3 = new Thread(processOrder3);

Thread thread4 = new Thread(processOrder4);

Thread thread5 = new Thread(processOrder5);

//依次启动线程

thread1.start();

thread2.start();

thread3.start();

thread4.start();

thread5.start();

}

}

模拟商城的购物过程Java_编写Java程序,模拟网上商城购物,当用户选好物品提交订单时,每笔订单会自动生成一个唯一的订单编号。...相关推荐

  1. 编写java程序模拟简单的计算器

    /*** 编写java程序模拟简单的计算器* 定义名为Number的类其中有两个整型数据成员变量n1和n2应该声明为私有* 编写构造方法赋予n1和n2初始值* 再为该类定义加addition().减s ...

  2. 编写一个程序实现方法的覆盖java_编写Java程序代码必须先声明一个____,然后在其中编写实现需求的业务代码。...

    [多选题]下列关于多行注释的应用,正确的是( ) [单选题]是在思维中把对象分解为各个部分.侧面.属性以及阶段,分别加以考察的方法.(1.0分) [判断题]多行注释"/*...*/" ...

  3. 银联银行卡卡号java_编写Java程序,使用单例模式,创建可以生成银联借记卡号的工具类...

    编写Java程序,使用单例模式,创建可以生成银联借记卡号的工具类 编写Java程序,使用单例模式,创建可以生成银联借记卡号的工具类,银联借记卡号是一个 19 位的数字,卡号以"62" ...

  4. 声明银行账户类 java_编写Java程序,使用ThreadLocal类,项目中创建账户类 Account,类中包括账户名称name、 ThreadLocal 类的引用变量amount,表示存款...

    查看本章节 查看作业目录 需求说明: 某用户共有两张银行卡,账户名称相同,但卡号和余额不同.模拟用户使用这两张银行卡进行消费的过程,并打印出消费明细 实现思路: 项目中创建账户类 Account,类中 ...

  5. truck 用法java_编写Java程序,创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck)。...

    返回本章节 返回作业目录 需求说明: 创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck). 父类有属性品牌(brand)和颜色(color). 在父 ...

  6. 编写Java程序_连锁超市购物结算系统

    目录 功能需求: 一.Use Case 1 显示商品信息列表: 二.Use Case 2 输入购买商品编号 三.Use Case 3 显示购物结算清单 需求分级: 实现代码: 功能需求: Soft f ...

  7. 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book)、一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户,使用简单工厂模式模拟这一过程。

    查看本章节 查看作业目录 需求说明: 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book).一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户, ...

  8. 【练习题】构造方法 编写Java程序,模拟简单的计算器。

    package day09; /*1.[练习题]构造方法 编写Java程序,模拟简单的计算器. 定义名为Number的类,其中有两个整型数据成员n1和n2,应声明为私有.编写构造方法,赋予n1和n2初 ...

  9. Java毕设项目网上商城购物系统(java+VUE+Mybatis+Maven+Mysql)

    Java毕设项目网上商城购物系统(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Web ...

最新文章

  1. VMware 收购 Kubernetes 初创公司 Heptio
  2. GIT中打标签(tag)的意义
  3. adb 重命名_Linux操作系统:三种最基本的文件重命名方法
  4. 5.1 计算机网络之传输层(传输层提供的服务及功能概述、端口、套接字--Socket、无连接UDP和面向连接TCP服务)
  5. php基于新浪ip库获取城市,PHP基于新浪IP库获取IP详细地址的方法
  6. pip如何安装到Linux服务器,linux中pip安装步骤与使用详解
  7. C#实现反射调用动态加载的DLL文件中的方法
  8. 人工智能技术在智能制造中的典型应用场景与标准体系研究
  9. 浅谈数据库三大范式的理解
  10. 判断整除(动态规划,递推)
  11. css除法,CSS_关系数据库 除法,假设有两个关系,R(a,b,c)和T(b,c - phpStudy
  12. Scrum立会报告+燃尽图(十月二十二日总第十三次)
  13. 【暴力枚举】LeetCode 78. Subsets
  14. java怎么对用户做自定义模版打印_Printing tools 自定义模板打印的实现
  15. Win32下对多个的线程句柄的关闭的控制(上)
  16. 关于【CDQ分治】的学习
  17. Kali linux 学习笔记(十三)主动信息收集——端口扫描(UDP扫描、TCP扫描) 2020.2.22
  18. 什么是WEBService,实现WEBService有哪些框架
  19. Unity大型场景程序化生成及优化技术—FPS迷宫生成和优化
  20. vc 鼠标移动画直线

热门文章

  1. Kerberos 域委派攻击之非约束性委派
  2. 大砍广告投放,还威胁要下架Twitter,马斯克怒向苹果开炮:宁可开战也不付30%“过路费”
  3. 微软发现绕过苹果 SIP 根限制的 macOS 漏洞
  4. 利用python计算太阳天顶角、方位角、高度角
  5. 2019最新Linux云计算学习教程(学习路线+课程大纲+面试题+视频教程+网盘下载)
  6. 虾扑:shopee虾皮怎么上传宝贝
  7. 测速的c语言程序,M法T法测速单片机程序设计.doc
  8. java共享单车管理系统
  9. SCU - 4438 (KMP)
  10. 生物信息学|DeepPurpose:药物靶标相互作用预测的深度学习库