编写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;}@Overridepublic 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();}
}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部