java线程-简单购物车秒杀设计

本文通过模拟四个购物车线程对有限数量的商品进行秒杀,介绍了如何使用Java实现并发控制和资源竞争处理。演示了当商品数量不足以满足所有请求时,如何确定哪些请求能够成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

购物车秒杀设计

假设某商品有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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值