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

简介: 编写Java程序,模拟网上商城购物,当用户选好物品提交订单时,每笔订单会自动生成一个唯一的订单编号。

需求说明:


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


现在简单模拟 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();
  }
}



相关文章
|
1月前
|
Java 流计算
利用java8 的 CompletableFuture 优化 Flink 程序
本文探讨了Flink使用avatorscript脚本语言时遇到的性能瓶颈,并通过CompletableFuture优化代码,显著提升了Flink的QPS。文中详细介绍了avatorscript的使用方法,包括自定义函数、从Map中取值、使用Java工具类及AviatorScript函数等,帮助读者更好地理解和应用avatorscript。
利用java8 的 CompletableFuture 优化 Flink 程序
|
2月前
|
XML 存储 JSON
Java程序部署
Java程序部署
|
28天前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
42 2
|
1月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
|
1月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
35 1
|
2月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
42 5
|
2月前
|
Java 编译器 数据库连接
探索Java中的异常处理:提升程序的鲁棒性
【9月更文挑战第25天】在Java的世界里,异常是那些不请自来、令人头疼的“客人”。它们悄无声息地潜入我们的代码,一旦出现,便可能导致程序崩溃或行为异常。但是,如果能够妥善管理这些异常,我们就能将潜在的灾难转变为增强程序鲁棒性和用户体验的机会。本文将通过深入浅出的方式,带领读者理解Java异常处理的重要性,并提供实用的策略来优雅地处理这些意外情况。让我们一起学习如何在Java中捕捉、处理和预防异常,确保我们的程序即使在面对不可预见的错误时也能保持稳健运行。
|
1月前
|
Java Python
如何通过Java程序调用python脚本
如何通过Java程序调用python脚本
27 0
|
2月前
|
监控 Java 数据库
Java程序如何进行不停机更新?
Java程序如何进行不停机更新?
94 1
|
1月前
|
Java
java的程序记录时间
java的程序记录时间
24 0