查看本章節
查看作業目錄
需求說明:
模擬網上商城購物,當用戶選好物品提交訂單時,每筆訂單會自動生成一個唯一的訂單編號,而部分電子商務網站在資料高峰期時,一毫秒可能需要處理近千筆的訂單
現在簡單模擬 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();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/142071.html
標籤:其他
下一篇:【SSM -MyBatis篇03】MyBatis Generator(MBG)配置屬性詳解(基于MyBatis3) - 逆向生成 - 配置MBG模板
