この章を見る
ジョブディレクトリを表示する
ニーズの声明:
オンラインショッピングをシミュレートし、ユーザーがアイテムを選択して注文を送信すると、各注文は自動的に一意の注文番号を生成します。一部のeコマースWebサイトでは、データのピーク時に1ミリ秒で1,000件近くの注文を処理する必要がある場合があります。
ここで、5つの注文が同時に送信され、一意の注文番号が生成されるシナリオを単純にシミュレートします。注文番号生成ルールは、ミリ秒単位の現在の時刻+注文番号です。
たとえば、現在の時刻のミリ秒数が150000の場合、1次の数は1500001であり、9次の数は1500009です。
実現のアイデア:
プロジェクトに注文クラスOrderを作成します(注文番号、注文金額、注文ユーザー)
注文処理クラスProcessOrderを作成してRunnableインターフェイスを実装し、注文タイプのメンバー変数と整数静的カウントを注文番号(初期1)として定義し、注文番号を生成するメソッドを追加します
注文番号を生成する方法では、スリープを使用して500ミリ秒を遅延させると同時に、同期コードブロックを追加し、静的変数カウントを同期モニターとして指定し、システム時間ミリ秒と同期コードブロック内の注文番号を使用して注文番号操作を生成します。
同期コードブロックの外側で、注文ユーザー、注文金額、注文番号を印刷します
テスト起動クラスTestOrderを作成します。このクラスのmain()メソッドで、パラメーター化されたコンストラクターを使用して、5つのOrderオブジェクトをインスタンス化します。ProcessOrder(Order order)構築メソッドを使用して、ProcessOrderクラスの5つのオブジェクトをインスタンス化し、5つのOrderオブジェクトを構築メソッドのパラメーターorderに順番に渡します。それぞれ5つのスレッドオブジェクトを作成し、5つのProcessOrdersを渡してテストを開始します
実装コード:
注文
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();
}
}