浏览 2386 次
锁定老帖子 主题:java 线程同步模拟存取钱
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-12-03
经过一番努力终点于写出来了.供需要找线程同步案例的朋友一起学习,交流 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类中为红色的去掉会产生不同的效果,能很好的演示线程同步问题 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-12-03
同步的块是不是大了点,同步帐户不行吗?
|
|
返回顶楼 | |