论坛首页 入门技术论坛

java 线程同步模拟存取钱

浏览 2387 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-12-03  
OO
很久没上来了,看到学生学程序学得没意思,于是就突发其想写个有意思的程序,让学生深入了解,线程这东西对职高生来说,也的确是有点难度哦.
经过一番努力终点于写出来了.供需要找线程同步案例的朋友一起学习,交流
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  synchronized 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类中为红色的去掉会产生不同的效果,能很好的演示线程同步问题
   发表时间:2007-12-03  
同步的块是不是大了点,同步帐户不行吗?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics