购物车秒杀设计
假设某商品有3件,4个人将其放入购物车,模拟4人同时秒杀此商品。注:卖家的账户只有一个,只能有3个人可以付款成功。
模拟秒杀购物:假设有如下商品类
Goods{
private num=5; //表示商品数量为5
public int getNum(){return num; }
public void setNum(int x){ num=x; }
}
有甲、乙、丙、丁4个购物车线程,分别装入1-3件商品(随机数产生)。
若商品数量-购买数量为正数,则秒杀成功,否则为秒杀失败,并在所有秒杀结束后输出结果。如:
商品数量共计:5件。
秒杀开始:……
秒杀结束,结果如下:
甲:购物车有 3 件商品,购买 成功!
乙:购物车有 1 件商品,购买 成功!
丙:购物车有 1 件商品,购买 成功!
丁:购物车有 2 件商品,购买 失败!
代码如下:
import java.util.Random;
class Good{
private int num;
public int getNum() {return num;}//获得当前商品数量
public void setNum(int x) {num=x;}//设置商品数量
public void buy() {num--;}//每被调用一次,商品数量相应减少
}
class Co extends Thread{
private Good g;
String name;
private int num,len=0;
private int Selled[];
private boolean suc=false;//判断是否购买成功
public Co(String n,Good s) {//构造函数
name=n;g=s;
Random ran=new Random();
num=ran.nextInt(2)+1;//随机产生2~3
Selled=new int[g.getNum()];
}
public void run() {
synchronized(g) {
int x=g.getNum();
if(x<0 || x<num) {suc=false;return;}
try{sleep(1);}catch(InterruptedException e){;}
//增加切换次数
for(int i=0;i<num;i++) {
Selled[len]++;len++;
suc=true;
g.buy();
}
try{sleep(1);}catch(InterruptedException e){;}
//增加切换速度
}
}
public void showResult() {
if(suc==true)
System.out.print("\n"+name+"购物车有"+num+"件商品,购买成功!");
else
System.out.print("\n"+name+"购物车有"+num+"件商品,购买失败!");
}
}
public class App1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Good g=new Good();
g.setNum(5);
Co c[]=new Co[4];
c[0]=new Co("甲",g);
c[1]=new Co("已",g);
c[2]=new Co("丙",g);
c[3]=new Co("丁",g);
System.out.print("秒杀开始:...\n");
c[0].start();c[1].start();c[2].start();c[3].start();
for(int i=0;i<c.length;i++)
try {c[i].join();}catch(InterruptedException e) {;}
System.out.print("秒杀结束,结果如下:");
for(int i=0;i<c.length;i++)
c[i].showResult();
}
}