java 线程同步模拟存取钱

很久没上来了,看到学生学程序学得没意思,于是就突发其想写个有意思的程序,让学生深入了解,线程这东西对职高生来说,也的确是有点难度哦.
经过一番努力终点于写出来了.供需要找线程同步案例的朋友一起学习,交流
1,写了一个Accout的银行账户类,代码如下:
package ch11;

public class Accout
{
/**
* 账户名
*/
String name;
/**
* 账号余额
*/
double money;
/**
* 存钱操作常量
*/
static final int save=0;
/**
* 取钱操作常量
*/
static final int sub=1;
/**
* 账号操作方式
*/
int x;
Accout(){};//无参数的构造函数
/**
* 要操作的数
*/
double number;//要操作的数
Accout(String name,double x)
{
this.name=name;
this.money=x;
}
/**
* 设置要操作的钱的值
* @param number 对账号操作的数目
*/
public void setNumber(double number)
{
this.number=number;
}
/**
* 获取操作账号的数目
* @return 操作账号的数目
*/
public double getNumber()
{
return number;
}
/**
* 设置操作账号的方式
* @param x 设置操作账号的方式
* x :1 取钱
* x: 0 存钱
*/
public void setOp(int x)
{
this.x=x;
}
/**
* 获得账号操作方式
* @return 返回操作账号的方式
*/
public int getOp()
{
return x;
}
/**
* 返回账号余额
* @return 账号余额
*/
public double getMoney()
{
return money;
}
/**
* 设置账号余额
* @param money 账号余额
*/
public void setMoney(double money)
{
this.money = money;
}
/**
* 获取账号名
* @return 开户名
*/
public String getName()
{
return name;
}
/**
* 设置账号名
* @param name 账号名
*/
public void setName(String name)
{
this.name = name;
}
/**
* 相应账号的操作过程
*/
public [color=red]synchronized[/color] void op()
{//如果是存钱,那么就把存的钱加入到账户
if(getOp()==save)
{
setMoney(getMoney()+this.getNumber());
System.out.println("存钱成功,现在账号上有:"+getMoney());
}
//取钱
if(getOp()==sub)
{
if(this.number>getMoney())//1.选判断账号是否有足够余额
throw new ArithmeticException("账户余额不足账户余额:"+getMoney());
else
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}//扣除相应操作数
setMoney(this.getMoney()-this.getNumber());
System.out.println(Thread.currentThread().getName()+"你取到"+this.getNumber()+"元\n"+"帐户余额:"+this.getMoney());
}
}
}

}
2.写了一个模拟运行测试的类.代码如下:
package ch11;

public class AccoutUser implements Runnable
{
Accout a;

AccoutUser(Accout a,double x)
{
this.a=a;
a.setNumber(x);
}
public void run()
{
a.op();

}


public static void main(String[] args)
{
Accout a=new Accout("你",3000);
a.setOp(Accout.sub);
AccoutUser au1=new AccoutUser(a,2000);
Thread t1=new Thread(au1,"你");
Thread t2=new Thread(au1,"你老婆");
t1.start();
t2.start();
}
}
编译运行,将Accout类中为红色的去掉会产生不同的效果,能很好的演示线程同步问题
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值